ATL的出现旨在让程序员用C++方便灵活地开发COM对象。ATL本身相当小巧灵活,用它可以创建轻量级的,自包含的,可复用的二进制代码,不用任何附加的运行时DLLs支持。如果我们在ATL工程里面使用了CString、CFile这些常用的基础类的时候调试都不能通过,为什么?因为ATL没有支持MFC,那我们该怎么办?
让ATL支持MFC我们有两种方法,方法一:在新建ATL工程的时候选择支持MFC;方法二:修改ATL工程的生成代码。
方法一比较简单,在新建ATL工程的向导中选中Support MFC,这样生成的ATL工程就能支持MFC用法。但是有时候,你并不是一开始就确定ATL工程需要支持MFC,或者是修改已经存在的ATL工程,这个时候如果重建工程就会浪费很多时间,所以我们需要第二种方法-修改工程的代码。
第二种方法的具体操作如下:
1、增加头文件
首先我们修改ATL工程中的StdAfx.h文件,在#include <atlbase.h>之前增加下面的代码:
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation extensions
2、修改工程设置
点击【Project Settings】对话框的【General】页, 改变 "Microsoft Foundation Classes" 下拉框的值为"Use MFC in a Static Library"或者"Use MFC in a Shared Library"
3、删除ATL工程的DLL入口部分代码
/
// DLL Entry Point
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance, &LIBID_ATLTESTLib);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
4、增加基于CWinApp的视图类,在删掉位DLL入口的位置上增加下面的代码(将设你的工程类是"CATLTest ")
class CATLTestApp : public CWinApp
{
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CATLTestApp )
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL
//{{AFX_MSG(CATLTestApp )
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CATLTestApp , CWinApp)
//{{AFX_MSG_MAP(CATLTestApp )
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CATLTestApp theApp;
BOOL CATLTestApp ::InitInstance()
{
_Module.Init(ObjectMap, m_hInstance, &LIBID_ATLTESTLib);
//LIBID_ATLTESTLib should be change to your project lib
return CWinApp::InitInstance();
}
int CATLTestApp ::ExitInstance()
{
_Module.Term();
return CWinApp::ExitInstance();
}
5、 修改DllCanUnloadNow函数为下面的代码
/
// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return (AfxDllCanUnloadNow()==S_OK && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
}
完成上面的几步操作你的ATL工程就可以很好的支持MFC。
更多技术文章请参看施昌权的个人网站: