如何让ATL支持MFC?

 

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。

 

转载:http://hi.baidu.com/piperworldcup/blog/item/52e9c181a03653ddbc3e1efc.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值