DLL Hell自作自演
ネットから拾ってきたWindowsシェル拡張のサンプルソース*1をVC++ 2008 ExpressでDLLにコンパイルしてregsvr32
で登録しようとしたら,
LoadLibrary("(私のビルドしたやつ).dll")に失敗しました.指定されたモジュールが見つかりません.
と怒られてしまった.そこであれこれ検索すると,
VisualStudioツールから Dependency Walker を起動し,(VisualStudio6に付属しています.NETにはないかも..)
「?」のついているdll(またはax,ocx)があるかどうかチェックし,
そのライブラリを入手しておいてください.
それがLoadLibraryになかったためdllの登録ができなかったということです.
という情報に行き当たったので,そのDependency Walkerというのを(フリーウェアとして公開されているので)手に入れてみた.
- http://www.dependencywalker.com/ Dependency Walker (depends.exe) Home Page
そして上記のDLLを調べてみると,DWMAPI.DLL
とPROPSYS.DLL
に?マークが付いていた.
LoadLibraryで自作DLLを読み込もうとすると、エラーが出て読み込めない。 ...
Dependency Walkerで見てみると、DWMAPI.DLLがシステムに無いようだ。 ...
IE7のせいか。
ここに解決策として、IE7をアンインストールする方法と、ダミーDLLを作ってやる方法が書いてある。 ...
... ということらしいので,リンク先に従って,問答無用で S_FALSE
を返す DwmExtendFrameIntoClientArea
を含む偽DWMAPI.DLL
をビルドしてみた.PROPSYS.DLL
についても,Dependency Walkerの情報によれば要求されているのはPROPSYS.DLL
の PSRegisterPropertySchema
, PSUnregisterPropertySchema
の2つらしいので,それらを含む偽者をビルドした.そして c:\WINDOWS\system32\
に置いてregsvr32
を再チャレンジ → やっぱり駄目.サンプルコードをよく見たらそもそも根本のところでVistaにしかないAPIを読んでたことに気付いたので諦めた.
ここまでが午前中の出来事で,前置き(ぉ
夜になってWindows Media Playerを立ち上げようとしたら,例の「問題が発生したため、wmplayer.exeを終了します。ご不便をおかけして申し訳ありません」メッセージと共に落ちてしまう.何度試しても駄目.そこでふと思い当たった,自分で c:\WINDOWS\system32\
に置いた偽DLLがまずいんじゃね? → 除去 → WMP回復!
ということでDLLは怖いね,.netが色々うるさい気持ちも分かるね,というお話でした.
- http://msdn2.microsoft.com/ja-jp/library/51ket42z.aspx .NET Framework 開発者ガイド アセンブリのバージョン管理
- wikipedia:"アセンブリ (.NET)"