ATL写的DLL中调用MFC对话框

项目需求,制作BHO并且要求有个按钮。BHO使用ATL实现,按钮我想使用MFC的dialg上放置按钮的方式。1、先将ATL工程改成支持

MFC,见:http://support.microsoft.com/default.aspx?scid=kb;en-us;q173974,或是在创建工程是直接选上suppot MFC。

2、添加Dialog资源,然后在继承于IObjectWithSiteImpl接口的BHO类里添加上Dialog成员,并在某处使用Dialog.Create初使化,

在SetSite中或其它地方使用ShowWindow切换显示dialog。

几点注意的地方:

1、如果此 DLL 相对于 MFC DLL 是动态链接的,
//  则从此 DLL 导出的任何调入
//  MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
//  该函数的最前面。
//
//  例如:
//
//  extern "C" BOOL PASCAL EXPORT ExportedFunction()
//  {
//   AFX_MANAGE_STATE(AfxGetStaticModuleState());
//   // 此处为普通函数体
//  }
//
//  此宏先于任何 MFC 调用
//  出现在每个函数中十分重要。这意味着
//  它必须作为函数中的第一个语句
//  出现,甚至先于所有对象变量声明,
//  这是因为它们的构造函数可能生成 MFC
//  DLL 调用。

2、#include <afxwin.h>和#include <atlbase.h>要注意先后顺序,否则会出现

fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>。

参见:http://www.wangchao.net.cn/bbsdetail_64574.html

几乎不用MFC,导致我花了三个小时在研究一个断言,而这个断言是因为我在调用ShowWindow之前没有进行初使化(doModal(模式

)或者Create(无模式))导致的,而我还以为是我在ATL中使用MFC的方法不对,最后主管一语中的,他说你先找个普通的DLL然后试

图在其中调用一个对话框看那边是否正常。结果我在普通的DLL里也出现这个错误,然后去网上搜一搜,才发现犯了这个低级错误,

狂汗……

原文地址:https://www.cnblogs.com/k1988/p/2165724.html