DLLを安全に呼び出す

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

DLLを安全に呼び出す

投稿記事 by naohiro19 » 11年前

  1. 呼び出すDLL関数の構造体をHMODULE と 関数ポインタで使いたい関数を設定しておく
  2. DLL関数の構造体のHMODULEにLoadLibraryを使って読み込みます。
  3. DLL関数の構造体の関数ポインタにGetProcAddress関数を使って関数ポインタのアドレスを取得します。
  4. DLL関数の構造体の関数ポインタを使ってDLLの関数を呼び出します。
  5. DLL関数の構造体のHMODULEをFreeLibraryを使って解放します。
たとえば User32.dllのMessageBox関数を呼び出すときは

CODE:

//ヘッダーファイル
//User32.dllの関数ポインタ
struct user32Function
{
	HMODULE m_DLL; //DLLのモジュールハンドル
	
	int (__stdcall*) MessageBoxFunc(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption,UINT uType);
};
extern  user32Function user32; 

CODE:

//User32.dllをロードする
if (user32.m_DLL == NULL)
{
	user32.m_DLL = LoadLibrary(_T("User32.dll");
        //MessageBoxAの関数ポインタを設定する
	user32.MessageBoxFunc = (int(__stdcall*)(HWND, LPCSTR, LPCSTR, UINT))GetProcAddress(user32.m_DLL, "MessageBoxA");
}

user32.MessageBoxFunc(NULL, "テスト", "テスト", MB_OK);

if( user32.m_DLL ){
    FreeLibrary(user32.m_DLL);
}
とすればMessageBoxAを呼び出すことができます。

ちなみにDXライブラリのDxWinAPI.h/DxWinAPI.cppより参考にしています。
最後に編集したユーザー naohiro19 on 2014年4月13日(日) 11:37 [ 編集 2 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: DLLを安全に呼び出す

投稿記事 by みけCAT » 11年前

肝心のuser32.MessageBoxFuncを呼び出すときにNULLでないかチェックしないと、
「安全に呼び出す」というタイトルと矛盾していると思います。
あと、user32.m_DLLがLoadLibraryの後にNULLになっていないかにチェックも必要ですね。
逆に、これより危険に呼び出す(安全でなく呼び出す)というのは、どのような方法を想定しているのでしょうか?