VS 创建ATL组件(C++)

news/2024/7/5 7:46:54

目录

  • 1、新建ATL项目
  • 2、添加接口类、实现接口方法
  • 3、创建自己的方法。在头文件Add.h中添加声明
  • 4、在源文件Add.cpp中添加函数实现
  • 5、在MyComTest.idl中添加方法接口设置,如interface IAdd:IDispatch中所示。
  • 6、解决方案配置选择release, 平台选择x64,生成。MyComTest.dll 为 64位的COM 组件。MyComTest.tlb 是之后C++ 调用Com所需要包含的文件。
  • 7、注册COM组件
  • 8、调用COM组件

1、新建ATL项目

打开Visual Studio 2022 新建ATL项目
在这里插入图片描述

2、添加接口类、实现接口方法

在这里插入图片描述
设置短名称为Temp 其他的会自动填充

ProgID 设置为 项目名+“.”+短名称 (MyComTest.add )

文件类型以及其他默认就好点击完成

这里需要注意两个值

ProgID 是之后 vbs 及其他语言 调用组件所需要提供的名称

接口 add 为之后配置 idl 所需要找到的接口名

3、创建自己的方法。在头文件Add.h中添加声明

在这里插入图片描述
也可以切换到类视图,选中刚才添加的接口,如下,然后右键单击【添加】添加方法。

在这里插入图片描述

4、在源文件Add.cpp中添加函数实现

在这里插入图片描述
值得一提的是

__result 必须为指针用来进行返回

return 默认为 S_OK表示执行成功

5、在MyComTest.idl中添加方法接口设置,如interface IAdd:IDispatch中所示。

在这里插入图片描述

[in] 表示 输入 [out] 表示输出 [retval] 表示作为返回值给外界

值得一提的是 retval 必须只能有一个 而且必须跟在out 后面

6、解决方案配置选择release, 平台选择x64,生成。MyComTest.dll 为 64位的COM 组件。MyComTest.tlb 是之后C++ 调用Com所需要包含的文件。

在这里插入图片描述

在这里插入图片描述
这里会看到生成报错

不用管他 打开我们的项目目录
在这里插入图片描述
MyComTest.dll 为 Com 组件本体

MyComTest.tlb 是之后C++ 调用Com所需要包含的文件

7、注册COM组件

在当前目录以管理员身份打开CMD,输入如下代码,完成注册。

在这里插入图片描述
也可以将注册命令写到文本里,保存成bat格式运行。
在这里插入图片描述


8、调用COM组件

在该解决方案下,添加C++控制台应用,在此工程中添加MyComTest工程中的两个头文件(MyComTest_i.c,MyComTest_i.h --主要用来查看CLSID和IID),在TestMyCom.cpp文件中添加引用

添加测试代码

在这里插入图片描述
运行
在这里插入图片描述

也可以这样实例化COM组件

/*说明
*功能:多字节转宽字节
*参数: str:多字节字符串
*返回: 宽字节字符串
*/
static wchar_t* str2wstr(const char*str)
{
	if(str == 0)
	{
		return 0;
	}
	wchar_t* _wchar;
	int len = MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0);
	_wchar = new wchar_t[len + 1]; MultiByteToWideChar(CP_ACP,0,str,-1,_wchar ,len);
	_wchar [len] = '\0';
	return _wchar ;
}

/*说明
*功能:初始化组件
*参数: Type:组件接口类型
*参数: comId:组件ID
*返回: 组件接口对象指针:成功  NULL:失败
*/
template<typename Type>
static Type* InitCom(LPCOLESTR comId)
{
	GUID clsid = GUID_NULL;
	HRESULT hr = CLSIDFromProgID(comId,&clsid);
	if(FAILED(hr))/*组件不存在*/
	{
		return NULL;
	}

	IUnKnown* pCard = NULL;
	hr = ::CoCreateInstance(clsid,nullptr,CLSCTX_ALL,IID_IUnknown,(LPVOID*)&pCard);
	if(nullptr == pCard)/*实例化组件失败*/
	{
		return NULL;
	}

	Type *pCom;
	hr = pCard->QueryInterface(__uuidof(Type), (void**)&pCom);
	pCard->Release();
	pCard = NULL;
	if(NULL == pCom)/*查询组件接口失败*/
	{
		return NULL;
	}
	
	return pCom;
}


---main()添加---
std::string odId = "MyComTest.add";
testAdd = InitCom<IAdd>(str2wstr(odId.c_str()));
if(testAdd == nullptr)/*实例化组件失败*/
{
	return NULL;
}



https://blog.csdn.net/qq_40628925/article/details/118097146

https://www.cnblogs.com/HathawayLee/p/16911808.html


http://lihuaxi.xjx100.cn/news/1026364.html

相关文章

M1 M2上能安装上Autocad 2024 Mac 中文版吗 autocad m1 m2版本有啦 终于支持Ventura 13x了

AutoCAD是一款强大的工具&#xff0c;适合于各种领域的设计和绘图。它具有二维图形和三维建模功能、多种文件格式支持、自定义命令和样式、批处理和脚本等特点&#xff0c;可以帮助用户实现高质量的设计和建模。同时&#xff0c;还支持云端存储和共享&#xff0c;方便用户随时随…

qs.stringify 的基本用法

qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装&#xff08;axios 自带qs , // import qs from ‘qs’&#xff09; 1、基本用法 qs.parse()将URL解析成对象的形式: let url userwdx&pwd123&appToken7d22e38e-5717-11e7-907b-a6006ad3dba0 qs.parse(…

量子计算机在信用评分卡组合优化中的应用最优题解

文章目录量子计算机在信用评分卡组合优化中的应用题解思路最下方量子计算机在信用评分卡组合优化中的应用题解 最新进度在文章最下方卡片&#xff0c;加入获取思路数据代码论文&#xff1a;2023十三届MathorCup交流 (第一时间在CSDN分享&#xff0c;文章底部) 思路 A题给我的…

1 Nginx跨域配置

跨域问题在之前的单体架构开发中&#xff0c;其实是比较少见的问题&#xff0c;除非是需要接入第三方SDK时&#xff0c;才需要处理此问题。但随着现在前后端分离、分布式架构的流行&#xff0c;跨域问题也成为了每个Java开发必须要懂得解决的一个问题。 跨域问题产生的原因 产…

Java避免死锁的几个常见方法(有测试代码和分析过程)

目录 Java避免死锁的几个常见方法 死锁产生的条件 上死锁代码 然后 &#xff1a;jstack 14320 >> jstack.text Java避免死锁的几个常见方法 Java避免死锁的几个常见方法 避免一个线程同时获取多个锁。避免一个线程在锁内同时占用多个资源&#xff0c;尽量保证每个锁…

URLEncode原理(全网详解)

概念&#xff1a; URLEncode是一种将特殊字符转换成百分号编码的方法&#xff0c;以便浏览器和服务器之间能够正确地处理它们。该方法会将某些字符替换为由 % 和其后面的两个十六进制数字所组成的编码。这些字符包括字母、数字、下划线、连字符、句点以及某些保留字符。 URLE…

基于亚马逊云科技无服务器架构,开发者可以有效实现快速上线

开发一个“爆款”游戏总共需要几步&#xff1f;Marvel Snap可能会告诉你&#xff1a;第一步&#xff0c;专心致志把游戏做好、提高可玩性&#xff1b;第二步&#xff0c;把其他工作交给亚马逊云科技。 相关数据显示&#xff0c;自2022年10月18日正式发行以来&#xff0c;在不到…

有学生问我,重构是什么?我应该如何回答?

重构到底是什么&#xff1f;只是代码的推倒重新编码&#xff1f;还是有规则、有方法可寻&#xff1f;当然&#xff0c;结论肯定是有的&#xff0c;本文&#xff0c;我们通过一个简单的实例&#xff0c;来理解一下重构。 1.借助一个实例需求 这是一个影片出租店用的程序&#…