您的位置:首页 > 其它

Atl COM Dll工程中调用dll中资源的问题

2010-12-30 15:22 477 查看
在做IE BHO插件dll的时候,需要打开一个模式对话框。当我添加了dialog资源,然后MyDialog dlg; dlg.DoModal();时,afxwin1.inl第23、26行出现断言失败:

_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle()

{ ASSERT(afxCurrentInstanceHandle != NULL);

return afxCurrentInstanceHandle; }

_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()

{ ASSERT(afxCurrentResourceHandle != NULL);

return afxCurrentResourceHandle; }

可以发现是afxCurrentInstanceHandle和afxCurrentResourceHandle这两个为NULL造成的。然后我想起来,dll中AfxGetInstanceHandle()方法默认返回的是.exe的资源访问句柄。对此MSDN说明如下:

AfxGetInstanceHandle
always returns the HINSTANCE
of your
executable file (.EXE) unless it is called from within a DLL linked with the
USRDLL version of MFC. In this case, it returns an HINSTANCE
to the
DLL.

于是乎,我在MyDialog dlg; dlg.DoModal();之前加上

AFX_MANAGE_STATE(AfxGetAppModuleState());

心想着这下可以了吧?可是还是出现相同的问题。根据经验,这是可以的啊。而且我的stdafx.h种已经包含了mfc的相关头文件,比如:

//-----------------------------------------------------------------------------

#include <afxwin.h> //----- MFC core and standard components

#include <afxext.h> //----- MFC extensions

#ifndef _AFX_NO_OLE_SUPPORT

#include <afxole.h> //----- MFC OLE classes

#include <afxodlgs.h> //----- MFC OLE dialog classes

#include <afxdisp.h> //----- MFC Automation classes

#endif //----- _AFX_NO_OLE_SUPPORT

检查了DllMain()方法,原来没有调用:

if (!AfxWinInit(hInstance, NULL, _T(""), 0))

{

AfxWinTerm();

return FALSE;

}

加上这个一切正常了,测试了一下AFX_MANAGE_STATE(AfxGetAppModuleState()); 也可以去掉。

看来,exe或者dll中加载资源时候,一定要注意切换资源所在的HINSTANCE,同时在atl com dll中使用MFC,一定要调用AfxWinInit()初始化相关参数。

附加几点:

1. 查阅资源,发现原来AFX_MANAGE_STATE(AfxGetAppModuleState());的用法是这样的:

如果从外面调用dll里面发布出来的方法,在该方法中加载资源,比如加载该dll定义的对话框资源,应该在其方法实现里,最前面加上这句,使得dll之外调用时,自动的切换MFC资源加载的句柄,方法调用完后会自动恢复成原来的。

2. 在dialog.DoModal();的前后这样尝试动态的自己设置ResourceHandle,资源加载完后恢复也不行。

AFX_MANAGE_STATE(AfxGetAppModuleState()); //DllMain()中AfxWinInit()以后,这句可以省略。

HINSTANCE hExeIns = AfxGetInstanceHandle(); //不调用AfxWinInit(),此句人就报错。

AfxSetResourceHandle((HINSTANCE)_Module.m_hInstResource);// 切换MFC加载资源从当前exe到当前dll资源实例

MyDialog dialog(AfxGetMainWnd());

dialog.DoModal();

AfxSetResourceHandle(hExeIns); // 将MFC资源加载切换回去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: