在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)
|