シェルエクステンションとして、IThumbnailProviderを実装して、いざデバッグしようとすると意外と大変なことがわかりました。日本語としての情報があまり見かけなかったので、これについて今回は情報を残しておきたいと思います。
参考元:Writing Windows Shell Extension with .NET 4 – Part 3
Explorerの拡張なので普通にデバッグ・・・というわけにもいかず、まずはExplorerを停止させます。
停止のさせ方は、スタートメニューが表示されている場所で、Ctrl+Shift+右クリックをすると終了メニューがでてくるので、これで終了させます。(出てこない場合場所が悪いかも。AeroGlassで透けている、空き領域で行うとよさそうです)
この後、VisualStudioからデバッグ実行をするのですが、デバッグ対象を C:\Windows\Explorer.exe にします。
そのままデバッグ実行しても、なぜかブレークポイントで停止しません。(有効にはなるのですが)
どうやら調べてみると、拡張系が悪さ(不具合)を起こしたときに、メインの処理に影響がないように別プロセスとして実行されるようです。そのためVisualStudioでは正常にデバッグできないようです。子プロセスもデバッグ対象にできるWinDbgならきっと出来るのでしょうが・・・。
そこで、この別プロセスとならないようにするための仕込みを行います。
レジストリに指定した拡張子で自分のDllを登録しているかと思いますが、その場所にもう1つキーを作成します。
HKCR +- FileExt + shellex * 値として自分のGUID {abcd0123-0123-4576-0000-123412341234} が書かれているはず +- CLSID + 自分のGUID * キー名は DisableProcessIsolation, 値種別 REG_DWORD, 値を 1
このようにHKCRの下のCLSID内に自分のGUIDを記録し、その中にキーとして DisableProcessIsolation を作成します。DWORDの形式で値を1にセットします。これにより別プロセスで実行されなくなり、デバッガで停止させて状態を確認することが出来るようになります。
一応ここまでの情報を知ってさえいれば、MSDNをみても何のことを言っているのかがわかるようになるかと思います。自分も最初情報にたどり着けていたにもかかわらず、イマイチわからなかったのでスルーしてしまいました。
個人的にはこれらのデバッグはリモート環境を用意して、開発機にやらせないほうがいいと思いました。今や各種仮想マシンのソフトウェアもあるし、これらを活用してデバッグ対象とした方が開発はやりやすいと思います。
コメント