首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  组件开发  |  ATL   


如何让ATL支持MFC


原作者:不详    源出处:不详    发布者:施昌权    发布类型:转载    发布日期:2008-08-29

              

        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。

 


关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号