FAQ11-3
|
Q. DLLの関数をEXEから呼び出す方法は
あるDLLの関数を利用したいのですが,DLLの関数をEXEから呼び出す方法がよくわかりません.LoadLibrary()して,それからどうすればいいのでしょうか?
|
|
|
A. インポートライブラリを使う
GetProcAddress()を使う
LoadLibrary()してDLLを読みこんだ後は,GetProcAddress()を使います(リスト11-7).
例えば,mydll.dllの中にある関数,MyDllProc()を呼びだいという場合は,リスト11-8のようにします.
[リスト11-7] :
FARPROC GetProcAddress( hModule, pszProc )
HMODULE hModule; DLLモジュールのハンドル
LPCSTR pszProc; 関数名のアドレス
[リスト11-8] :
int (CALLBACK* pfnMyDllProc)( int ); //プロトタイプ宣言
HANDLE hMod = LoadLibrary( "MYDLL.DLL" ); //DLLの読み込み
(FARPROC&)pfnMyDllProc = GetProcAddress( hMod, "MyDllProc" ); //関数アドレス獲得
pfnMyDllProc( n ); //関数実行
インポートライブラリを使う
LoadLibrary()とGetProcAddress()を使ってDLLの関数を呼ぶこともできますが,通常はこういったことはせず,インポートライブラリというものを使います.
インポートライブラリとは,拡張子.LIBのファイルで,リンカーでリンクされるファイルのことです.
一般には公開しないファイルで,開発者にだけ配ります.DLLを作成する場合はインポートライブラリも作れるようになっているはずです.
インポートライブラリは,普通のライブラリと違って,LoadLibrary()とGetProcAddress()と同等のことを自動でやってくれます.
DLLの関数を呼び出す側は,ただ,普通のライブラリ関数のように呼びだすだけでいいのです.
例えば,mydll.dllの中にある関数,MyDllProc()を呼び出したいという場合は,mydll.libをリンクするだけで,MyDllProc()を使うことができるようになってしまいます.
つまり,あたかもDLLが普通のライブラリのように,EXEファイル中に収まっているかのように使うことができます(図11-5).んー,なんとなくDLL=Dynamic Link Libraryと呼ばれる由縁がわかってきた気がします.
[図11-5] : 
気付いていないかもしれませんが,実はWindows APIの関数たちは,このインポートライブラリを使ってダイナミックリンクされているのです.
例えば,32ビットアプリケーションの場合,kernel32.lib,user32.lib,gdi32.libというインポートライブラリが必ずリンクされています.
この三つのファイルが,それぞれkernel32.dll,user32.dll,gdi32.dllの中にある関数を読み込むことによって,Windows APIを実現しているのです.
DEFファイルでインポートする
インポートライブラリが無い場合,LoadLibrary()とGetProcAddress()を使わなくてはいけないのかというと,そういうわけではありません.インポートライブラリが無くても,それとまったく同じことをすることができます.
拡張子が.DEFのモジュール定義ファイルに,IMPORTSという記述をすることで,あたかもインポートライブラリをリンクしているかのようにすることができます.
例えば,mydll.dllの中の三つの関数,MyDllPorc(),MyDllProc2(),MyDllProc3()をインポートしたいという場合,リスト11-9のようにDEFファイルに記述します.
Windows APIの関数も同様にインポートすることができます.例えば,GDI32.LIBをリンクするのをやめて,GDI32.DLLの関数BitBlt()だけを使いたいという場合,リスト11-10のようにします.
このような使い方はまずしないのですが,隠しAPIとかを使う場合,この方法を使うことがあります.
[リスト11-9] :
IMPORTS
MYDLL.MyDllProc
MYDLL.MyDllProc2
MYDLL.MyDllProc3
[リスト11-10] :
IMPORTS
GDI32.BitBlt
Back to FAQ main page