在Windows 2000下調試程序時,碰到一個問題:在導入一個win32 DLL時,LoadLibrary()函數返回值為空,GetLastError返回值為127 (找不到指定的程序)。其他DLL文件調用都正常。最后發現這個DLL文件中一個API函數WTSGetActiveConsoleSessionId()不支持2000系統,所以導致DLL文件總是導入不成功。
加載dll失敗,原因大致有:
1.dll初始化時失敗,這是因為dll本身有問題;
2.dll需要的其他dll文件不存在;
3.調用的dll再本地機器上不存在。
解決方案: 用動態加載的方式
1 typedef DWORD (WINAPI *LoadWTSGetActiveConsoleSessionId)(VOID);
2
3 HMODULE hModKrl = LoadLibrary(TEXT("Kernel32.dll"));
4 if (!hModKrl)
5 {
6 LOG("導入 kernel32.dll 失敗");
7 return;
8 }
9
10 LoadWTSGetActiveConsoleSessionId fWTSGetActiveConsoleSessionId = (LoadWTSGetActiveConsoleSessionId)GetProcAddress(hModKrl, "WTSGetActiveConsoleSessionId");
11 if (!fWTSGetActiveConsoleSessionId)
12 {
13 LOG("調用WTSGetActiveConsoleSessionId 失敗");
14 return;
15 }
16 dwSessionId = fWTSGetActiveConsoleSessionId();
17
18 if (hModKrl)
19 {
20 FreeLibrary(hModKrl);
21 }
使用動態加載dll,在Windows2000系統下成功,但獲取WTSGetActiveConsoleSessionId函數入口地址失敗。查找msdn發現此函數不支持2000系統。
Requirements
Minimum supported client |
Windows XP |
Minimum supported server |
Windows Server 2003 |
Header |
- Winbase.h (include Windows.h)
|