DLL Hell自作自演

ネットから拾ってきたWindowsシェル拡張のサンプルソース*1VC++ 2008 ExpressでDLLにコンパイルしてregsvr32で登録しようとしたら,

LoadLibrary("(私のビルドしたやつ).dll")に失敗しました.指定されたモジュールが見つかりません.

と怒られてしまった.そこであれこれ検索すると,

VisualStudioツールから Dependency Walker を起動し,(VisualStudio6に付属しています.NETにはないかも..)
「?」のついているdll(またはax,ocx)があるかどうかチェックし,
そのライブラリを入手しておいてください.
それがLoadLibraryになかったためdllの登録ができなかったということです.

という情報に行き当たったので,そのDependency Walkerというのを(フリーウェアとして公開されているので)手に入れてみた.

そして上記のDLLを調べてみると,DWMAPI.DLLPROPSYS.DLLに?マークが付いていた.

LoadLibraryで自作DLLを読み込もうとすると、エラーが出て読み込めない。 ...

Dependency Walkerで見てみると、DWMAPI.DLLがシステムに無いようだ。 ...

IE7のせいか。

dwmapi.dll, non vista and IE7

ここに解決策として、IE7をアンインストールする方法と、ダミーDLLを作ってやる方法が書いてある。 ...

... ということらしいので,リンク先に従って,問答無用で S_FALSE を返す DwmExtendFrameIntoClientArea を含む偽DWMAPI.DLLをビルドしてみた.PROPSYS.DLLについても,Dependency Walkerの情報によれば要求されているのはPROPSYS.DLLPSRegisterPropertySchema, PSUnregisterPropertySchema の2つらしいので,それらを含む偽者をビルドした.そして c:\WINDOWS\system32\ に置いてregsvr32を再チャレンジ → やっぱり駄目.サンプルコードをよく見たらそもそも根本のところでVistaにしかないAPIを読んでたことに気付いたので諦めた.
ここまでが午前中の出来事で,前置き(ぉ
夜になってWindows Media Playerを立ち上げようとしたら,例の「問題が発生したため、wmplayer.exeを終了します。ご不便をおかけして申し訳ありません」メッセージと共に落ちてしまう.何度試しても駄目.そこでふと思い当たった,自分で c:\WINDOWS\system32\ に置いた偽DLLがまずいんじゃね? → 除去 → WMP回復!
ということでDLLは怖いね,.netが色々うるさい気持ちも分かるね,というお話でした.