> 文章列表 > VS 创建ATL组件(C++)

VS 创建ATL组件(C++)

VS 创建ATL组件(C++)

目录

  • 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项目
VS 创建ATL组件(C++)

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

VS 创建ATL组件(C++)
设置短名称为Temp 其他的会自动填充

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

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

这里需要注意两个值

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

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

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

VS 创建ATL组件(C++)
也可以切换到类视图,选中刚才添加的接口,如下,然后右键单击【添加】添加方法。

VS 创建ATL组件(C++)

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

VS 创建ATL组件(C++)
值得一提的是

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

return 默认为 S_OK表示执行成功

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

VS 创建ATL组件(C++)

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

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

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

VS 创建ATL组件(C++)

VS 创建ATL组件(C++)
这里会看到生成报错

不用管他 打开我们的项目目录
VS 创建ATL组件(C++)
MyComTest.dll 为 Com 组件本体

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

7、注册COM组件

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

VS 创建ATL组件(C++)
也可以将注册命令写到文本里,保存成bat格式运行。
VS 创建ATL组件(C++)


8、调用COM组件

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

添加测试代码

VS 创建ATL组件(C++)
运行
VS 创建ATL组件(C++)

也可以这样实例化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