【C++ COM组件 运用ATL工程创建和调用COM组件】

ATL (Active Template Library) 是一个用于简化 COM (Component Object Model) 组件开发的库。使用 ATL,你可以创建 COM 对象,这些对象可以跨进程和跨机器进行通信。下面是一个简单的步骤,说明如何使用 ATL 创建一个简单的 COM 组件,并在另一个程序中使用它。

步骤 1: 创建一个 ATL 项目

  1. 打开 Visual Studio。
  2. 创建一个新的 ATL 项目。选择 “ATL Simple Object”(ATL 简单对象)作为模板。
  3. 输入项目名称和位置,然后完成向导。

步骤 2: 定义 COM 接口和类

// MyInterface.h  
[  uuid(YOUR_INTERFACE_GUID),  version(1.0),  helpstring("My Interface")  
]  
interface IMyInterface : IUnknown  
{  [id(1), helpstring("method Add")] HRESULT Add([in] int a, [in] int b, [out, retval] int* result);  
};

然后在你的 ATL 类中实现这个方法:

// MyComponent.h  
class ATL_NO_VTABLE CMyComponent :  public CComObjectRootEx<CComSingleThreadModel>,  public CComCoClass<CMyComponent, &CLSID_MyComponent>,  public IMyInterface  
{  
public:  BEGIN_COM_MAP(CMyComponent)  COM_INTERFACE_ENTRY(IMyInterface)  END_COM_MAP()  DECLARE_NOT_AGGREGATABLE(CMyComponent)  BEGIN_MESSAGE_MAP(CMyComponent)  END_MESSAGE_MAP()  // IMyInterface  
public:  STDMETHOD(Add)(int a, int b, int* result);  
};  // MyComponent.cpp  
STDMETHODIMP CMyComponent::Add(int a, int b, int* result)  
{  *result = a + b;  return S_OK;  
}

步骤 3: 注册 COM 组件

编译你的 ATL 项目后,你需要注册你的 COM 组件。这通常可以通过运行生成的 DLL 或 EXE 文件的 /RegServer 选项来完成。例如,如果你的 DLL 名为 MyComponent.dll,你可以在命令提示符中运行 MyComponent.dll /RegServer。(管理员权限)

regsvr32 localpath/MyComponent.dll

EXE作为COM组件的宿主还是比较少见的,但也有很多传统公司使用这种方法。。。
EXE注册的方法是比较麻烦的,如果就是需要注册EXE,可以用:

MyComponent.exe localpath/RegServer

步骤 4: 在另一个程序中使用 COM 组件

在另一个程序中,你可以使用 CoCreateInstance 来创建你的 COM 组件的实例,并调用其方法。以下是一个简单的示例:

#include <windows.h>  
#include <objbase.h>  
#include "MyInterface.h" // 包含你的接口定义  int main()  
{  CoInitialize(NULL);  IMyInterface* pMyInterface = NULL;  HRESULT hr = CoCreateInstance(CLSID_MyComponent, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)&pMyInterface);  if (SUCCEEDED(hr))  {  int result;  hr = pMyInterface->Add(2, 3, &result);  if (SUCCEEDED(hr))  {  printf("Result: %d\n", result); // 输出 "Result: 5"  }  pMyInterface->Release();  }  CoUninitialize();  return 0;  
}

注意:确保在包含 MyInterface.h 之前定义了你的接口 GUID (YOUR_INTERFACE_GUID)。你可以在你的 ATL 项目中找到这个 GUID。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue之一键部署的shell脚本和它的点.bat文件、海螺AI、ChatGPT

MENU 前言vite.config.ts的配置deploy文件夹的其他内容remote.shpwd.txtdeploy.bat 前言 1、在src同级新建deploy.bat文件&#xff1b; 2、在src同级新建deploy文件夹&#xff0c;文件夹中新建pwd.txt和remote.sh文件&#xff1b; 3、配置好后&#xff0c;直接双击deploy.bat文…

鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS

1、LFS文件系统结构体介绍 会分2部分来介绍结构体部分&#xff0c;先介绍LittleFS文件系统的结构体&#xff0c;然后介绍LiteOS-M内核中提供的和LittleFS相关的一些结构体。 1.1 LittleFS的枚举结构体 在openharmony/third_party/littlefs/lfs.h头文件中定义LittleFS的枚举、…

JavaScript-for循环

学习目标&#xff1a; 掌握for循环 学习内容&#xff1a; for循环语法退出循环for循环和while循环有什么区别for循环嵌套 for循环语法&#xff1a; 作用&#xff1a;重复执行代码。好处&#xff1a;把声明起始值、循环条件、变化值写到一起&#xff0c;让人一目了然&#xff…

在线时钟python案例

试了一下用通义来编写一些代码&#xff0c;以下是一个在线时钟的样例&#xff0c;只要能运行python就可以使用。 以下是运行后的结果。 代码&#xff08;复制可用&#xff09; import tkinter as tk from time import strftimedef update_time():current_time strftime(&quo…

Postman使用教程(Postman详细图文教程)

本文讲解的是postman工具安装、postman安装教程、postman工具下载、postman使用教程。Postman使得得开发人员和测试人员能够更高效地与Web服务进行交互和调试。 Postman不仅支持常见的HTTP方法&#xff0c;如GET、POST、PUT、DELETE等&#xff0c;还提供了丰富的请求编辑功能&…

c++ 设计类的时的构造函数和析构函数的注意事项

纯概念 类和对象是c里非常重要的概念。类属于一种数据类型&#xff0c;是根据业务逻辑&#xff0c;封装一些成员变量&#xff08;数据部分&#xff09;和成员函数&#xff08;逻辑部分&#xff09;。业务逻辑使用时&#xff0c;类可以实例化成对象。其中&#xff0c;在实例化对…

20240615给飞凌的OK3588-C开发板刷Rockchip原厂的Buildroot后的测试报告

20240615给飞凌的OK3588-C开发板刷Rockchip原厂的Buildroot后的测试报告&#xff1a; 【切记&#xff0c;由于没有替换DTS的&#xff0c;开发板发热量巨大&#xff01;因此配备鼓风机进行加强散热了】 0、adb 默认没有 1、HDMI IN 4K 2024/6/15 20:32 4K全屏 2、HDMI OUT …

C++ 二分查找法【面试】

在C中实现二分查找法是一个常见的面试问题。二分查找法是一种在有序数组中查找特定元素的算法&#xff0c;其时间复杂度为O(log n)。以下是使用C实现二分查找的示例代码&#xff1a; #include <iostream> #include <vector>// 二分查找法函数 int binarySearch(co…

激活函数(Activation Function)

定义 激活函数&#xff08; A c t i v a t i o n F u n c t i o n Activation\ Function Activation Function&#xff09;是一种添加到人工神经网络中的函数&#xff0c;旨在帮助网络学习数据中的复杂模式。在神经网络中&#xff0c;除了输入层外&#xff0c;隐藏层和输出层的…

Redis原理篇——分布式锁

Redis原理篇——分布式锁 分布式锁是什么&#xff1f;分布式锁有哪些特性&#xff1f;分布式锁常用实现方式Redis 实现分布式锁一、简单的 Redis 锁二、带过期时间的 Redis 锁三、加上 Owner 的 Redis 锁四、Lua 脚本确保原子性 分布式锁是什么&#xff1f; 分布式锁是在分布式…

centos 8 换源

centos 8 换源 进入 root&#xff0c;切换至 yum.repos.d 目录 cd /etc/yum.repos.d/创建新文件夹并将源文件备份为 repo.bak mkdir backup && mv *repo backup/下载国内 yum 源文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos…

软件体系结构笔记(自用)

来自《软件体系结构原理、方法与实践&#xff08;第三版&#xff09;》清华大学出版社 张友生编著 1-8章12章 复习笔记 如有错误&#xff0c;欢迎指正&#xff01;&#xff01;&#xff01;

HCIP认证笔记(填空)

1、为防止攻击者伪造BGP报文对设备进行攻击,可以通过配置GTSM功能检测IP报文中的TTL值的范围来对设备进行保护。如果某台设备配置了“peer x.x.x.x valid-ttl-hops 100",则被检测的报文的TTL值的有效范围为【(156),255】; 解析: peer {group-name | ipv4-address…

学习cel-go了解一下通用表达语言评估是什么

文章目录 1. 前言2. cel-go2.1 cel-go关键概念Applications(应用)Compilation(编译)Expressions(表达式)Environment环境解析表达式的三个阶段 3. cel-go的使用4. cel-go使用5. 说明6. 小结7. 参考 1. 前言 最近因为在项目里面实现的一个使用和||来组合获取字段值的功能有点儿…

MySQL员工练习

MySQL员工练习 1.数据显示 员工信息表emp&#xff1a; 字段&#xff1a;员工id,员工名字,工作岗位,部门经理,受雇日期,薪水,奖金,部门编号 英文名&#xff1a;EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,BONUS,DEPTNO 部门信息表dept&#xff1a; 字段&#xff1a;部门编号,部门名称,部…

自然抽样和平顶抽样

自然抽样和平顶抽样是两种信号处理和采样技术&#xff0c;它们在音频信号处理、信号重建以及数字信号处理中有着不同的应用。 1. 自然抽样&#xff08;也称为理想抽样或无失真抽样&#xff09;&#xff1a;样值脉冲的幅度随原始信号m(t)的幅度而变&#xff1b; 自然抽样过程的…

Java算法常用技巧

一、排序 资料&#xff1a;https://blog.csdn.net/weixin_72499901/article/details/136592073 正排序 import java.util.Arrays;public class SortArray {public static void main(String[] args) {int[] citations {5, 3, 8, 2, 1, 4};// 打印原数组System.out.println(&…

windows10或者windows11怎么查看自己电脑显卡型号

win10系统&#xff1a; 右键单击任务栏后弹出菜单选择任务管理器 打开任务管理器后&#xff0c;点击性能查看左侧GPU0或者GPU1 如果有nvidia字样表示自己电脑有nvidia显卡&#xff0c;如果是AMD或者intel字样表示没有nvidia显卡。注意如果你有GPU0或者GPU1说明你电脑是双显卡&…

后端中缓存的作用以及基于Spring框架演示实现缓存

缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…

spring boot配置ssl证书,支持https访问

1. 阿里云官网下载证书,云控制台搜索ssl&#xff0c;点击进入。 2.点击免费证书&#xff0c;立即购买。 3. 点击创建证书&#xff0c;填写完证书申请后&#xff0c;等待证书签发。 4. 证书签发以后&#xff0c;点击下载证书&#xff0c;spring boot选tomcat服务器类型的。 5. …