【C++】06 COM组件

创建COM组件

  1. 打开Visual Studio 2019 新建ATL项目 → \rightarrow 项目名称:ComTest → \rightarrow 创建 → \rightarrow 勾选支持COM+ 1.0 → \rightarrow 确定。
    在这里插入图片描述
  2. 添加一个新的ATL对象。右键ComTest项目 → \rightarrow 添加 → \rightarrow 新建项 → \rightarrow ATL → \rightarrow ATL简单对象 → \rightarrow 名称为Temp → \rightarrow 添加 → \rightarrow ProgID取名为项目名+“.”+短名称 → \rightarrow 完成。
    在这里插入图片描述
    在这里插入图片描述
  3. 创建自己的方法。在头文件Temp.h添加函数声明。
// Temp.h: CTemp 的声明#pragma once
#include "resource.h"       // 主符号#include "ComTest_i.h"#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endifusing namespace ATL;// CTempclass ATL_NO_VTABLE CTemp :public CComObjectRootEx<CComSingleThreadModel>,public CComCoClass<CTemp, &CLSID_Temp>,public IDispatchImpl<ITemp, &IID_ITemp, &LIBID_ComTestLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:CTemp(){}DECLARE_REGISTRY_RESOURCEID(106)BEGIN_COM_MAP(CTemp)COM_INTERFACE_ENTRY(ITemp)COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct(){return S_OK;}void FinalRelease(){}public://添加的函数声明STDMETHODIMP Number(LONG __num, LONG* __result); };OBJECT_ENTRY_AUTO(__uuidof(Temp), CTemp)
  1. 在源文件Temp.cpp添加函数实现。
// Temp.cpp: CTemp 的实现#include "pch.h"
#include "Temp.h"// CTempSTDMETHODIMP CTemp::Number(LONG __num, LONG* __result)
{// STDMETHODIMP 宏 HRESULT __stdcall// __result 是返回值// __num 为参数*__result = __num * __num;//默认返回 函数执行正确return S_OK;
}
  1. ComTest.idl中添加方法接口设置,如interface iTemp:IDispatch中所示。
// ComTest.idl: ComTest 的 IDL 源
//// 此文件将由 MIDL 工具处理以
// 生成类型库(ComTest.tlb)和封送处理代码。import "oaidl.idl";
import "ocidl.idl";[//接口定义object,                                      //所定义的接口是一个COM接口uuid(df89cc50-0d06-448b-82de-18e0125073ef),  //相应的接口IIDdual,nonextensible,pointer_default(unique)                      //默认的次级指针类型为uniqu
]
interface ITemp : IDispatch
{//方法接口设置[id(1)] HRESULT Number([in] LONG __num, [out, retval] LONG* __result);
};
[//类型库定义,只能包含一个,所有的类对象coclass都必须在其中定义uuid(b688c1b1-80b4-48ca-b72f-5546e66889a6),version(1.0),         //类型库版本号
]
library ComTestLib
{importlib("stdole2.tlb");[uuid(e79637f4-414a-4664-b0ae-e4743772bfb4)]coclass Temp{[default] interface ITemp;};
};import "shobjidl.idl";
  1. 解决方案配置选择Release,平台选择x64,生成。ComTest.dll 为 64位的COM 组件。ComTest.tlb 是之后C++ 调用Com所需要包含的文件。
    在这里插入图片描述

注册COM组件

  1. 注册。在当前目录以管理员身份打开CMD或powershell,输入如下代码,完成注册。
C:\Windows\SysWOW64\regsvr32.exe -i .\ComTest.dll

在这里插入图片描述

调用COM组件

  1. 打开Visual Studio 2019,文件 → \rightarrow 新建 → \rightarrow 项目 → \rightarrow 控制台应用 → \rightarrow 创建ComInvoke项目。
    在这里插入图片描述
  2. 在源文件ComInvoke.cpp中引入动态库文件ComTest.dll,右键ComInvoke项目 → \rightarrow 配置属性 → \rightarrow C/C++ → \rightarrow 常规 → \rightarrow 附加包含目录 → \rightarrow 新行 → \rightarrow 选择动态库目录。
    在这里插入图片描述
  3. ComInvoke.cpp中输入如下代码:
// ComInvoke.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include #import "ComTest.dll"					raw_interfaces_only raw_native_types no_namespace named_guidsint main()
{//初始化 COM 库,用来告诉 Windows 以单线程的方式创建 COM 对象::CoInitialize(0);//指向ITEMP类的智能指针ITempPtr pTemp = 0;//创建 COM 组件对象,有两种方式//HRESULT hr = pTemp.CreateInstance(CLSID_Temp);     //使用CLSID创建HRESULT hr = pTemp.CreateInstance("ComTest.Temp");   //使用ProgID创建long result;//调用类中的函数pTemp->Number(2, &result);//输出结果std::cout << result << std::endl;
}
  1. 点击本地Windows调试器,输出结果如下,成功调用!
    在这里插入图片描述

参考资料

我的书架:COM组件开发
vs2019 Com组件初探-简单的COM编写以及实现跨语言调用
COM组件和调用
Visual C++ 实践与提高 COM和COM+篇(高清pdf+源代码)
COM组件创建过程

本机目录

E:\Master\study\Cpp\ComTest


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部