面对现实,超越自己
逆水行舟,不进则退
posts - 269,comments - 32,trackbacks - 0
    在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)

   Library

Kernel32.lib

   DLL

Kernel32.dll
      

posted on 2012-05-09 14:59 王海光 阅读(7958) 评论(0)  编辑 收藏 引用 所属分类: MFC

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理