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


如何向 MFC EXE 添加 ATL 支持


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


                

概要

        此文章步骤都需要添加 ATL 支持到没有自动化支持 MFC EXE 列表。

更多信息

1. 将以下声明后添加到 CWinApp 派生对象在全局范围:
        CExeModule _Module;

        LONG CCExeModule Module::Unlock()
        {
                LONG l = CComModule::Unlock();
                if (l == 0)
                {
                        #if _WIN32_WINNT >= 0x0400
                        if (CoSuspendClassObjects() == S_OK)
                                PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
                        #else
                        PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
                        #endif
                }
                return l;
        }

        BEGIN_OBJECT_MAP(ObjectMap)
        END_OBJECT_MAP()

        LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
        {
                while (*p1 != NULL)
                {
                        LPCTSTR p = p2;
                        while (*p != NULL)
                        {
                                if (*p1 == *p++)
                                        return p1+1;
                        }
                        p1++;
                }
                return NULL;
        }
 
2. 至段首 InitInstance() 添加以下:
        // Initialize OLE libraries
        if (!AfxOleInit())
        {
                AfxMessageBox("OLE initialization failed");
                return FALSE;
        }

        m_bATLInited = TRUE;

        HRESULT hRes = 0;
        if (FAILED(hRes))
        {
                m_bATLInited = FALSE;
                return FALSE;
        }

        _Module.Init(ObjectMap, AfxGetInstanceHandle());
        _Module.dwThreadID = GetCurrentThreadId();

        TCHAR szTokens[] = _T("-/");

        BOOL bRun = TRUE;
        LPCTSTR lpszToken = FindOneOf(m_lpCmdLine, szTokens);
        while (lpszToken != NULL)
        {
                if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
                {
                        _Module.UpdateRegistryFromResource(IDR_ATLMFC, FALSE);
                       _Module.UnregisterServer();
                       bRun = FALSE;
                        break;
                }
                if (lstrcmpi(lpszToken, _T("RegServer"))==0)
                {
                        _Module.UpdateRegistryFromResource(IDR_ATLMFC, TRUE);
                        _Module.RegisterServer(TRUE);
                        bRun = FALSE;
                        break;
                }
                lpszToken = FindOneOf(lpszToken, szTokens);
        }

        if (!bRun)
        {
                m_bATLInited = FALSE;
                return FALSE;
        }

        hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,REGCLS_MULTIPLEUSE);

        if (FAILED(hRes))
        {
                m_bATLInited = FALSE;
                return FALSE;
        }
3. InitInstance() 中添加以下 ParseCommandLine(cmdInfo) 后:
        if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated)
        {
                return TRUE;
        }
4. 将下列公共成员变量添加到 CWinApp 派生对象:
        BOOL m_bATLInited;
5. 覆盖 ExitInstance() 并调用基类 ExitInstance() 之前添加以下代码:
        if (m_bATLInited)
        {
                _Module.RevokeClassObjects();
               _Module.Term();
        }
6. 向项目添加 <project_name> .idl 文件并建立自定义规则以便调用 MIDL 编译器将生成 <project_name> .tlb、 project>_i.h 和 <project> _i.c 文件。 例如:
        midl /Oicf /h "<project_name>_i.h" /iid "<project_name>_i.c"
        "<project_name>.idl"
7. 包括 <project_name> _i.h 和 <project_name> _i.c <project_name> h 文件中。
8. 将 typelib 项添加到 .rc 文件。 这是通过单击 视图 菜单上 ResourceIncludes@@@ 并添加 1 TYPELIB "<project_name>.tlb" 到结果对话框的编译指令部分。
9. 为应用程序创建 .rgs 文件并作为资源添加。 这是通过插入自定义资源的类型 " 注册表 " 并设置的资源属性以便它指向 .rgs 文件。 确保资源 ID 是与上面使用UpdateRegistryFromResource() 首参数相同。
10. 添加以下到 stdafx.h 末尾:
        #define _ATL_APARTMENT_THREADED

        #include <atlbase.h>
        // You may derive a class from CComModule and use it if you want to
        // override something, but do not change the name of _Module.
        class CExeModule : public CComModule
        {
        public:
                LONG Unlock();
                DWORD dwThreadID;
        };
        extern CExeModule _Module;
        #include <atlcom.h>
11. 添加以下到 stdafx.cpp 末尾:

        #ifdef _ATL_STATIC_REGISTRY

        #include <statreg.h>
        #include <statreg.cpp>
        #endif

        #include <atlimpl.cpp>
注意 : 对于发布版本, 然后如果做不希望将 ATL 注册, 中静态链接包括 _ATL_DLL 项目设置 对话框中的预处理器符号中。

这篇文章中的信息适用于:
Microsoft ActiveX Template Library 2.0
Microsoft ActiveX Template Library 2.1



关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    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号