Win32 API DLLの動的ロード

プログラム実行中の任意のタイミングでDLLをロードする際には、LoadLibrary関数を用いる。さらにDLLに含まれる関数を実行するには、GetProcAddressで関数アドレスを取得する必要がある。


 Win32APIの呼出規約は WINAPI(stdcall)である。そのため、GetProcAddressでWin32 APIの関数のアドレスを取得し、関数を呼び出すときには、その関数の型をtypedefする際に、WINAPI呼び出し規約を指定する必要がある。


※WINAPI呼出規約は、呼び出されたサブルーチン側でスタックの巻き戻しを行う。



  • 以下のプログラムは、user32.dllからMessagwBoxW関数へのポインタを取得して、呼び出している。
  • #include <windows.h>
    
    typedef int (WINAPI *LPFNMESSAGEBOXW)(HWND, LPCWSTR, LPCWSTR, UINT);
    
    int main()
    {
        HMODULE hmod;
        LPFNMESSAGEBOXW lpfnMessageBoxW;
        
        hmod = LoadLibrary(TEXT("user32.dll"));
        if (hmod == NULL) {
            puts("LoadLibrary error");
            return 1;
        }
    
            
        lpfnMessageBoxW = (LPFNMESSAGEBOXW)GetProcAddress(hmod, "MessageBoxW");
        if (lpfnMessageBoxW == NULL) {
            FreeLibrary(hmod);
            puts("GetProcAddress error");
            return 1;
        }
        
    
        lpfnMessageBoxW(NULL, L"Hello, World!", L"Greeting", MB_OK);
    
        FreeLibrary(hmod);
    
        return 0;
    }


  • 参考

  • http://msdn.microsoft.com/ja-jp/library/cc429241.aspx LoadLibrary関数
    http://msdn.microsoft.com/ja-jp/library/cc429103.aspx FreeLibrary関数
    http://msdn.microsoft.com/ja-jp/library/cc429133.aspx GetProcAddress関数
    http://msdn.microsoft.com/ja-jp/library/46t77ak2(VS.80).aspx Visual C++ コンパイラ オプション /Gd、/Gr、/Gz (呼び出し規約)
    http://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84 Wikipedia 呼出規約