ATL 调用MFC扩展dll

本文详细记录了解决MFC扩展DLL在C#项目中调用时遇到的问题,包括如何正确使用AFX_MANAGE_STATE(AfxGetStaticModuleState())以及如何避免DllMain重复定义错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

最近在一个C#项目中要用到MFC的扩展dll,结果怎么引用都不行,首先是运行出现下列问题:

 

Debug Assert Failed

在afxwin2.inl的22行

 

后来查了发现是资源的问题,于是在接口函数中加了一句:

 

AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

结果编译出错:

 

DllMain重复定义

 

后来才发现是MFC的扩展dll只能是MFC的程序调用,一直找、一直试,到最后也没有调通。

 

最后实在没有办法,只好重新做dll,包原来的扩展dll。

又出现问题,程序是能通过了,但是对话框没有出来。

 

最后找到一篇回帖,才总算解决了。

 

提到“AFX_MANAGE_STATE(AfxGetStaticModuleState(   ))”的,是80%正解。在ATL程序里,准备“Create”或者“DoModal”的前面先加上这句!

而剩下的20%是这样,MFC扩展DLL的向导生成代码的注释里明确说了,当MFC扩展DLL的调用者不是MFC   EXE,而是MFC   DLL时(你的支持MFC的ATL组件相当于MFC   DLL),必须将“new   CDynLinkLibrary(newlistviewDLL);”这句从DllMain里拿掉。然后单独做一个引出函数如:

void   AFX_EXT_API   InitMyListViewModule()
{
new   CDynLinkLibrary(newlistviewDLL);
}

然后在你的MFC   DLL的CWinApp::InitInstance里手动调用这个函数。至此,MFC扩展DLL的链式资源才算是彻底初始化完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值