2009年08月02日

CE Setup DLL(2)

以前に書いたCE Setup DLL記事の続編。
たいした内容ではないけど、いろいろ試したので、忘れないように書いとく。

やりたいことは、Todayアイテム(プラグイン)の自動ON/OFFなのだから、システムがこれをやっているところの動作を調べればいい。
レジストリでEnabled=1としておいて、Today→設定→アイテム画面を開いて閉じるだけでアイテムが表示されるので、これの動作を調べればいいことになる。
以前にも調べたのだけど、今回はブロードキャストなのかどうか、メッセージが受理されるのを待機するのかどうかに焦点を当てて調べなおしてみた。

まずは、テストアプリの作成。
これはトップレベルウィンドウを一つだけ持ったアプリで、WM_SETTINGCHANGE(WM_WININICHANGE)を受けたら8秒間時間を潰してから既定の処理(SHHandleWMSettingChange)を呼び出すだけのもの。
8秒間時間を潰すこと以外は、アプリケーションウィザードが吐き出したコードのままだ。
これをビルドして、起動させておく。目的は、メッセージが受理されるのを待機するのかどうかの判定。

そして、リモートスパイで全てのトップレベルウィンドウへ渡されるメッセージを監視するようにして、アイテム画面を開いて閉じると、見事に全てのトップレベルウィンドウにWM_WININICHANGE(0xF2, 0)を送ってます。
てか、アイテムタブ→デザインタブと切り替えるだけで送ってる。
しかも、メッセージが処理されるのを待機してない。
調子に乗ってガンガン繰り返してたら、テストアプリが延々と8秒毎にWM_WININICHANGEを受け付けてるし。
他のウィンドウにはメッセージは即座に届いて即座に処理されてるけど、こいつは8秒待機してるんだから当然か。
それでも、延々と待ってたら、最終的にはすべてのメッセージを処理した。
このことから、アイテムタブを閉じるときに、PostMessageSendNotifyMessageでブロードキャストしているんだと推測される。
また、念のためにトップレベルではないウィンドウもチェックしてみたけど、こちらには予想通り当該メッセージは流れてない。

さらに、ボタンを2つ配置したダイアログベースアプリを作って、試してみた。
  • ボタン1は、::PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0xF2, 0);を実行
  • ボタン2は、::SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0xF2, 0);を実行
連打してみたけど、結果はまったく同じ。

こんな感じで、手持ちの環境では、HWND_BROADCASTで何の問題もないんだけど、MoonClockでは安全対策でブロードキャストは廃止して、Today画面(DesktopExplorerWindow)だけに送るようにしてるんで、こちらも試してみた。
アイテムの変更も確認できるように、ラジオボタンでMoonClockのEnabledレジストリを書き換える機能をつけて、ボタンも2つ追加。
  • ボタン3は、::PostMessage(::GetDesktopWindow(), WM_SETTINGCHANGE, 0xF2, 0);を実行
  • ボタン4は、::SendNotifyMessage(::GetDesktopWindow(), WM_SETTINGCHANGE, 0xF2, 0);を実行
これもまったく問題なし。MoonClockのON/OFFもちゃんと切り替わる。

SendMessageTimeoutの動作は前回検証してるんで省略。
アンインストール時は待機しなければならないんで、前回変更したまま(SendMessageTimeoutを使う)として、インストール完了時は、今回の検証結果を受けてPostMessageに変更してみた。
まったく問題なく動作するので、これでいこうと思う。

前回公開したSetupDLLのソースコードも更新しました。
posted by ZORAC at 01:22| Comment(2) | TrackBack(0) | プログラミング
この記事へのコメント
毎度参考にさせてもらってます。

Todayの設定画面の処理を参考にする…、そうですね、この画面ではちゃんと動作しているんですから、これをまねればいい理屈になります。

で、結局、非同期のPost等でブロードキャスト送信を行っているという処理が濃厚ですね。Send系の同期メッセージ送信は極力使用しない方がよさそう。

あとは、アンインストール時のSendMessageTimeoutが心配ですが…更新インストール時に避けて通れない処理ですから。
量販店の店頭でmicroSDつっこんで試すしかないですかね。TouchFLO搭載機の方、どうなんでしょうか?
Posted by じゅんたろ at 2009年08月02日 15:38
>じゅんたろさん

ども。
試した範囲だと、システムが行っている処理と決定的な差が発見できなかったです。
やっぱり、症状が発生する環境では、デッドロックが起こってるんですかねえ。

そう考えると、SendMessageTimeoutでブロック期間を制限するのは、一応の対策にはなりますね。
それと、アンインストールできなくなっちゃうと困るので、手動でアイテムを非表示にしていた場合は、
追加処理をしないでそのまま標準のアンインストール処理に任せるってのも有効だと思います。

量販店の店頭で確認するってのは、考えつきませんでした。
今のバージョンでは致命的な問題は起こらないはずだけど、試してみたいですね。
Posted by ZORAC at 2009年08月02日 20:32
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/30990286
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック