如何讓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://www.joyvc.cn


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/scq2099yt/archive/2008/03/20/2198901.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章