你應該做的第一件事就是聲明一個函數指針類型與導出功能兼容。如何正確做到這一點至關重要,是造成麻煩的最大可能性。仔細查看函數聲明以達到此目的:
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。另請注意,與使用Unicode字符串的其他Windows API不同,GetProcAddress使用const char *。字符串文字上沒有L前綴。
然後你怎麼稱呼它,這很簡單:
DWORD tick = pfnGetTickCount();
如果你有函數指針類型聲明錯誤,那麼你可以用AV你的程序崩潰,得到奇怪的函數結果或不平衡的堆棧。
爲什麼你認爲你應該調用'LoadLibrary'? 'kernel32.dll'已經加載到每個Windows進程中,你不需要自己加載它。 –