如何向 MFC EXE 添加 ATL 支持

本文介绍如何在没有自动化支持的MFCEXE中添加ATL支持,具体步骤包括修改CWinApp派生对象、初始化OLE库、注册类对象等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

概要

此文章步骤都需要添加 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

 

 

更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn

 

 

Visual Studio Code (VSCode)是一款轻量级的源代码编辑器,它支持安装各种语言和框架的插件来增强功能。若要为C++项目添加 ATL (Active Template Library) 支持,你需要安装一个专门针对C++和MFC的插件,以及可能需要配置相应的环境。 以下是安装ATL支持的步骤: 1. **安装C/C++插件**: 首先,确保你已经安装了C/C++ Extension Pack,它包含了很多基础的C++支持。打开VSCode,点击左下角的 Extensions 按钮,搜索 "C++" 或 "C/C++", 然后找到并安装 "ms-vscode.cpptools" 插件。 2. **下载和配置ATL SDK**: - 访问Microsoft的官方网站下载最新版的ATL SDK:[Microsoft ATL SDK](https://docs.microsoft.com/en-us/cpp ATL/atl-sdk-download) - 安装完成后,将包含头文件和库的路径添加到VSCode的系统环境变量中,特别是`Include` 和 `Library` 目录。 3. **设置C++工作区配置**: - 打开VSCode,点击左上角的 "File" -> "Preferences" -> "Settings" 或者快捷键 `Ctrl + ,` - 在JSON格式的工作区配置文件 (`settings.json`) 中,添加以下内容,指定ATL的路径: ```json { "c_cpp_properties": { "configurations": [ { "name": "Win32", "includePath": [ "${env:INCLUDE}", "${workspaceFolder}/**" ], "defines": ["_DEBUG"], "compilerPath": "cl.exe", "intelliSenseMode": "windows-gcc-x64" // 如果有需要,可以在这里加入 "additionalLibPaths": [path_to_atl_libs] 和 "libraries": [lib_name] } ] } } ``` 具体路径可能会因你的安装位置而异。 4. **重启VSCode**: 完成设置后,重启VSCode以便新配置生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值