0


ATL的出现旨在让程序员用C++方便灵活地开发COM对象。ATL本身相当小巧灵活,用它可以创建轻量级的,自包含的,可复用的二进制代码,不用任何附加的运行时DLLs支持。如果我们在ATL工程里面使用了CString、CFile这些常用的基础类的时候调试都不能通过,为什么?因为ATL没有支持MFC,那我们该怎么办?
让ATL支持MFC我们有两种方法,方法一:在新建ATL工程的时候在选中Support 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。

关闭 返回顶部
联系我们
Copyright © 2011. 聚财吧. All rights reserved.