最初にすべきことは、エクスポートされた関数と互換性のある関数ポインタ型を宣言することです。この権利を取得することは重大であり、問題に陥る可能性が最も高いです。これに到着する関数の宣言を注意深く見て:
typedef DWORD (WINAPI * GetTickCount_t)(void);
次に、関数ポインタ値を得るために、LoadLibrary関数とGetProcessAddressを使用しています。あなたは常にGPAの戻り値を関数ポインタ型にキャストしなければなりません。このように:
HMODULE hKernel = LoadLibrary(L"kernel32.dll");
assert(hKernel);
GetTickCount_t pfnGetTickCount = (GetTickCount_t)GetProcAddress(hKernel, "GetTickCount");
assert(pfnGetTickCount);
ここでの失敗モードはDLLへのパスです。 kernel32.dllは、常に検索パスにあるディレクトリであるc:\ windows \ system32に格納されているため、指定する必要はありませんでした。これは一般的に、あなた自身のDLLの場合ではありません。メインのEXEと同じディレクトリにのみ格納することで、フルパスの代わりにDLLファイル名を指定することができます。背景情報については、SetDllDirectory()のドキュメントを参照してください。
エクスポートされた関数の名前。ここでもやはり簡単ですが、Windows API関数はデコレートされていない名前でエクスポートされます。それはあなた自身のDLLでは一般的ではありませんが、extern "C"で関数を宣言せずにC++コンパイラを使用した場合は、先頭のアンダースコア、 "@nn"接尾辞、または混乱した名前でエクスポートをエクスポートできます。実際の名前を表示するには、DLLのDumpbin.exe/exportsを使用します。また、GetProcAddressは、Unicode文字列を使用するWindows APIの残りの部分とは異なり、const char *を使用します。文字列リテラルにL接頭辞はありません。
は、その後、あなたはそれを呼び出す、それは簡単です:
DWORD tick = pfnGetTickCount();
間違った関数ポインタ型の宣言を得たなら、あなたは奇妙な関数の結果または不均衡なスタックを取得し、AVを使ってプログラムをクラッシュすることがあります。
なぜあなたは 'LoadLibrary'を呼び出すべきだと思いますか? 'kernel32.dll'は既にすべてのWindowsプロセスにロードされています。自分でロードする必要はありません。 –