[转贴]在DLL中使用资源(推荐)[3]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 djhdu 的 blog

    这种方法在进入showdlg函数之后,通过afxgetresourcehandle来获得并保存当前状态模块的句柄。然后获得dll模块的句柄theapp.m_hinstance(当然,也可以使用getmodulehandle函数来获得dll模块的句柄),并使用afxsetresourcehandle函数来将其设置为当前状态状态。最后在调用对话框成功之后再用恢复afxsetresourcehandle资源句柄,将当前模块状态恢复。 

    这样做有些麻烦,但是有一点好处是可以在完成使用资源的任务之后就可以立即恢复资源句柄。而afx_manage_state(afxgetstaticmodulestate());的方法只能等函数的作用空间结束之后才恢复资源句柄。由于可执行文件必须重画工具条等原因,因此建议只要有可能就必须恢复资源句柄,否则可能会遇到许多问题。比如说,如果用户移动dll的对话框,而此时资源句柄仍然为dll的资源,那么程序就会崩溃。最好的恢复句柄的时机在对话框响应wm_initdialog消息的时候,因为这时对话框的模板等已经读出了。

    对于mfc extension dll(using shared mfc dll)类型的mfc dll,切换当前模块状态的方法与regular dll using shared mfc dll类型的mfc dll所使用的方法很相似,这里不再举例实现。二者不同的地方如下: 

    在mfc扩展dll中使用afx_manage_state(afxgetstaticmodulestate());时,会产生如下错误:

mfcs42d.lib(dllmodul.obj) : error lnk2005: __prawdllmain already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error lnk2005: _dllmain@12 already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error lnk2005: __prawdllmain already defined in dllextend.obj

因此在mfc扩展dll中需要将afx_manage_state(afxgetstaticmodulestate());换成afx_manage_state(afxgetappmodulestate());才能正确切换当前模块状态。

在mfc扩展dll中使用afxgetresourcehandle和afxsetresourcehandle的方法与在regular dll using shared mfc dll类型的mfc dll中所使用的方法相同。并且,dll模块的句柄可以通过mfc提供的dlgextentdll这个结构的hmodule成员来获得。即使用afxsetresourcehandle(dlgextentdll.hmodule);语句。

当然,对于动态链接到mfc的dll,也可以在调用该dll的mfc应用程序中使用afxgetresourcehandle和afxsetresourcehandle两个函数来切换当前状态模块。该dll模块的句柄可以用getmodulehandle函数来获得。在此不再赘述。

本文关键:[转贴]在DLL中使用资源(推荐)
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top