user32.dll:不同版本"USER32.DLL"动态库引发的问题



起因:

原先只运行在Vista操作系统中了Vista系统中新增加APIShutdownBlockReasonCreate后来该又要迁移到Windows XP系统上运行起先没觉得会出现问题类似于ShutdownBlockReasonCreate新增加API时对操作系统版本做了判断只有当前操作系统是Vista时于是带着很放松心情在Windows XP系统开始测试

问题:

由于ShutdownBlockReasonCreate这样是Vista操作系统新增加API在Windows XP系统中并不存在是在Vista+VS2008环境下进行编译所以编译时并无问题发生但是运行在Windows XP系统时需要隐式加载“USERS32.DLL”并要找到该DLL输出ShutdownBlockReasonCreate 当Windows XP系统发现“USERS32.DLL”中没有ShutdownBlockReasonCreate输出时便弹出异常消息提示ShutdownBlockReasonCreate不存在

解决:

通过对问题分析清楚知道是由于区别版本“USERS32.DLL”动态库文件输出接口区别所引发于是可以采取现显示加载“USERS32.DLL”通过获取“USERS32.DLL”输出地址方式来判断是否可以ShutdownBlockReasonCreate

# SHUTDOWN_CREATE "ShutdownBlockReasonCreate"

typedef BOOL(CALLBACK *ShutdownBlockCreate)(HWND hWnd, LPCWSTR pwszReason);

ShutdownBlockCreate ShutdownCreate = NULL;

HINSTANCE m_hHandle = NULL;


m_hHandle = LoadLibrary(_T("User32.dll"));



(NULL != m_hHandle)

{

ShutdownCreate = (ShutdownBlockCreate)GetProcAddress(m_hHandle, SHUTDOWN_CREATE);


}


(NULL != ShutdownCreate)

{

m_bShutDownBlock = ShutdownCreate(m_hWnd, _T(""));

}


采用这种方式可以有效回避启动时隐式加载“USERS32.DLL”并且判断输出接口是否存在问题在针对区别版本操作系统进行开发时该思路方法尤为有效
Tags:  错误模块user32.dll user32.dll函数 user32.dll.mui user32.dll

延伸阅读

最新评论

发表评论