VS 创建ATL组件(C++)

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 后面

如果有void或自定义类型的变量编译不过,可以在最前面obiect前添加 local,

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
COMComponent Object Model)是一种面向对象的组件化技术,常用于实现跨进程、跨机器的组件通信。C++可以使用COM组件来实现这种技术。 下面是使用C++创建和使用COM组件的基本步骤: 1.定义组件接口:使用IDL(Interface Definition Language)语言定义组件接口,包括组件的方法、属性和事件等。 2.实现组件:使用C++编写组件的实现代码,实现组件接口中定义的方法、属性和事件等。 3.注册组件:使用Windows系统提供的regsvr32工具将组件注册到系统中,以便其他程序可以使用它。 4.使用组件:在其他程序中通过COM接口调用组件的方法、属性和事件等。 以下是一个简单的示例,演示如何使用C++创建和使用COM组件: 1.定义组件接口: ``` // MyComponent.idl import "oaidl.idl"; [ object, uuid(01234567-89ab-cdef-0123-456789abcdef), dual, helpstring("IMyComponent Interface"), pointer_default(unique) ] interface IMyComponent : IDispatch{ [id(1), helpstring("Method1")] HRESULT Method1([in] BSTR arg1, [out, retval] VARIANT* retVal); }; ``` 2.实现组件: ``` // MyComponent.h class ATL_NO_VTABLE CMyComponent : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CMyComponent, &CLSID_MyComponent>, public IDispatchImpl<IMyComponent, &IID_IMyComponent, &LIBID_MyComponentLib, /*wMajor =*/ 1, /*wMinor =*/ 0> { public: DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMPONENT) DECLARE_NOT_AGGREGATABLE(CMyComponent) BEGIN_COM_MAP(CMyComponent) COM_INTERFACE_ENTRY(IMyComponent) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP() // IMyComponent methods public: STDMETHOD(Method1)(BSTR arg1, VARIANT* retVal); }; ``` ``` // MyComponent.cpp STDMETHODIMP CMyComponent::Method1(BSTR arg1, VARIANT* retVal) { // Do something here return S_OK; } ``` 3.注册组件: ``` regsvr32 MyComponent.dll ``` 4.使用组件: ``` // Client.cpp #include "MyComponent.h" int main() { CoInitialize(NULL); IMyComponentPtr pMyComponent; HRESULT hr = pMyComponent.CreateInstance(__uuidof(MyComponent)); if (SUCCEEDED(hr)) { VARIANT ret; hr = pMyComponent->Method1(L"arg1", &ret); if (SUCCEEDED(hr)) { // Do something with the returned VARIANT } } CoUninitialize(); return 0; } ``` 以上是一个简单的示例,演示了如何使用C++创建和使用COM组件。实际应用中,还需要考虑其他方面的问题,例如线程安全、错误处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值