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