OCXとDLLはどこが違うのですか? また,これらがどういう動き方をしているのか,解析するツールがあれば教えてください。
DLL,OCX,ActiveXコントロールなどは,外部に公開する関数を持つファイルという点で同じものです。ここでは,実際にシステムにあるOCXを例に,いくつかの実験を試みることにします。
Windows 98には「マルチメディアツール」の中にActive Movieコントロールというツールが標準で添付されています。スタートメニューのリンクを調べた人なら分かると思いますが,Active Movieコントロールというアプリケーションは実体がありません。
画面に示すように,実際のActive MovieコントロールはWindows\System\Run
DLL32.EXEという実行ファイルに,いくつかのオプションを付けて起動したものです。このRunDll32とは何者でしょうか。
このコマンドは,とても興味深い動作をします。実行オプションは次のとおりです。
>RunDll32 modulename,method
RunDll32は名前のとおり引数に指定したDLLをロードして,それが公開している関数を呼び出すコマンドです。modulenameの部分にDLLのファイル名を,methodに公開関数の名前を指定するわけです。ちなみに,RunDll32を使うと簡単にWindowsにエラーを引き起こすことができます。例えば,
RunDll32 KERNEL32.DLL,LoadModule
というようにAPIを不正に呼び出したりできるので危険な面を持ちます。したがって,使い方は一般には公開されていません。
さて,話を元に戻すと,ActiveMovieコントロールの実体はWindows\System\amovie.ocxというOCXコントロール(実際にはActiveXですが)の公開関数RunDll()でした。このように,OCX/ActiveXの実体は,なんらDLLと変わるところはありません。
DLLとOCX/ActiveXコントロールの違いは,必ず次の関数を実装しているという点です。
DllCanUnloadNow
DllGetClassObject
DllRegisterServer*
DllUnregisterServer*
(*:ActiveXでのみ必須)
OCX/ActiveXは機能を提供するサーバーを内蔵していて,さまざまなアプリケーション(クライアント)から利用されます。OCX/ActiveXコントロールをインストールするときにGUID/CLSIDがレジストリに登録(ActiveXの場合はDllRegisterServerが呼び出され,ActiveX自身でシステムに登録します)され,クライアントがOCX/ActiveXを利用するときにレジストリを手がかりにOCX/ActiveXがメモリにロードされます。その後,クライアントはOCX/ActiveXがエキスポートしているDllGetClassObjectを呼び出し,その機能のインタフェースを取り出して利用します。また,利用が終わったらDllCanunloadNowを呼び出してOCX/ActiveXをメモリから取り除いてよいことを知らせます。
amovie.ocxを調べるために,今回はデバッガSoftICE(COMPUWARE)を利用してみることにします。SoftICEはWindowsより下の層で動き,Windows動作中にいつでも動作を停止させ,ようすを見ることができる超強力なデバッガです。
amovie.ocxの公開関数シンボルをSoftICEロードしてSoftICEで調べてみたログをリスト1に示します。
リスト1に示すようにamovie.ocxはActiveXとして必要な全関数のほかにRunDll32で呼び出すためと思われる2関数を実装しています。これらの関数が,どのようなタイミングで呼び出されるか,SoftICEで関数のエントリにブレークポイントを仕掛けてみました。
リスト2はamovie.ocxの二つの公開関数にブレークポイントを仕掛けて,IE4.0でムービーがあるサイト(話題沸騰のhttp://www.fox.comにあるスターウォーズです)を見にいったときのログです。AMOVIEがロードされた後,DllGetClassObjectが呼び出されるようすが分かります。ここでレジスタダンプを取ってスタックなどを探ると,どのような経緯でロードされたかも分かります。
難解になるので本稿では省略しますが,SoftICEのような強力なデバッガを利用すると,動作中のWindowsを止めたいところで止め,ようすを見ることができるため,システムを探るのに最適でお勧めできます。SoftICEは現行製品の中で最高峰の機能を持ち,DLLなどのほかに32ビットVxD,16ビットドライバなど普通のデバッガでは追跡できないドライバ類にも強力に対応します。使うのはやや難しいかもしれませんが,Windowsを底の底まで探りたい人なら持っていて損はないでしょう。
(米田 聡)
![]() |
||||||||
写真 SoftICE 問エクセルソフト TEL03-5440-7875 10万8000円 (Windows 95/98版) 12万8000円 (Windows NT版) |
||||||||
画面1 Active Movieコントロールのプロパティを見ると, RunDLL32.EXE amovie.ocx,Rundllへのリンクになっている |