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