Win32 API DLLの動的ロード
プログラム実行中の任意のタイミングでDLLをロードする際には、LoadLibrary関数を用いる。さらにDLLに含まれる関数を実行するには、GetProcAddressで関数アドレスを取得する必要がある。
Win32APIの呼出規約は WINAPI(stdcall)である。そのため、GetProcAddressでWin32 APIの関数のアドレスを取得し、関数を呼び出すときには、その関数の型をtypedefする際に、WINAPI呼び出し規約を指定する必要がある。
※WINAPI呼出規約は、呼び出されたサブルーチン側でスタックの巻き戻しを行う。
#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 呼出規約