windows C++- Com技术简介(上)
在介绍C++和winrt与COM组件技术的关系之前,有必要介绍一下com组件技术,这项技术比较古老,但是它一直作为windows的基石存在。COM 是一类独立于平台且面向对象的分布式系统,用于创建可交互的二进制软件组件。 COM 技术是 Microsoft OLE(复合文档)和 ActiveX(支持 Internet 的组件)技术的基础。
注意我们仅仅介绍基础的COM组件技术,而不是全面的覆盖这项技术,讲述这项技术是一项非常困难的工作,所以许多知识点我们只是提及,不会深究,我个人比较推荐的书是《com组件论》,这本书非常值得一看。
COM技术被认为是C++进阶的高级技术,它从本质上解释了接口和实现,但是由于COM编程过于复杂,并且COM技术本质上windows使用的技术,所以慢慢的它被隐藏到系统深处了。
组件对象模型
Microsoft 组件对象模型 (COM) 是一个独立于平台的面向对象的分布式系统,可用于创建可以交互的二进制软件组件。 COM 技术是 Microsoft OLE(复合文档)和 ActiveX(支持 Internet 的组件)以及其他组件的基础技术。
要理解 COM(以及所有基于 COM 的技术),关键是要理解它不是一种面向对象的语言,而是一种标准。 COM 也没有指定应用程序的结构;语言、结构和实现细节留给应用程序开发人员。 相反,COM 指定对象模型和编程要求,使 COM 对象(也称为 COM 组件,有时简称为对象)能够与其他对象进行交互。 这些对象可以在单个进程中,也可以在其他进程中,甚至可以在远程计算机上。 它们可以以不同的语言编写,并且它们在结构上可能大相径庭,这就是为什么 COM 被称为二进制标准的原因;在程序转换为二进制计算机代码后应用的标准。
COM 唯一的语言要求是,代码是用一种可以创建指针结构并通过指针显式或隐式调用函数的语言生成的。 面向对象的语言(如 C++ 和 Smalltalk)提供简化 COM 对象的实现的编程机制,而 C、Java 和 VBScript 等语言可用于创建和使用 COM 对象。
COM 定义 COM 对象的基本性质。 通常,软件对象由一组数据和操作数据的函数组成。 COM 对象是专门通过一组或多组相关函数来访问对象数据的对象。 这些函数集被称为接口,接口的函数被称为方法。 此外,COM 要求访问接口方法的唯一方法是通过指向接口的指针。
除了指定基本的二进制对象标准外,COM 还定义了某些基本接口,这些接口提供了所有基于 COM 的技术所共有的功能,并提供了所有组件所需的少量功能。 COM 还定义了对象如何在分布式环境中协同工作,并添加了安全功能来帮助提供系统和组件完整性。
COM 简介
Microsoft 组件对象模型 (COM) 定义了二进制互操作性标准,可利用此标准创建在运行时交互的可重用软件库。 无需将 COM 库编译到应用程序中即可使用 COM 库。 COM 是许多 Microsoft 产品和技术的基础,例如 Windows Media Player 和 Windows Server。
COM 定义适用于许多操作系统和硬件平台的二进制标准。 对于网络计算,COM 定义了标准线路格式和协议,用于在不同硬件平台上运行的对象之间交互。 COM 独立于实现语言,这意味着可以使用不同的编程语言(如 C++ 和 .NET Framework 中的编程语言)创建 COM 库。
COM 规范提供了启用跨平台软件重用的所有基本概念:
- 组件之间的函数调用的二进制标准;
- 用于将函数强类型分组到接口中的预配;
- 提供多态性、功能发现和对象生存期跟踪的基接口;
- 唯一标识组件及其接口的机制;
- 从部署创建组件实例的组件加载程序;
COM 有许多部件协同工作,从而支持创建从可重用组件生成的应用程序:
- 提供符合 COM 规范的运行时环境的主机系统;
- 定义功能协定的接口和实现接口的组件;
- 向系统提供组件的服务器和使用组件提供的功能的客户端;
- 用于跟踪组件在本地和远程主机上的部署位置的注册表;
- 用于找到本地和远程主机上的组件并将服务器连接到客户端的服务控制管理器;
- 定义如何在主机文件系统上导航文件内容的结构化存储协议;
启用跨主机和平台的代码重用是 COM 的核心。 可重用接口实现命名为组件、组件对象或 COM 对象。 一个组件实现一个或多个 COM 接口。
通过设计库实现的接口,可定义自定义 COM 库。 库的使用者无需了解库的部署和实现详细信息即可发现和使用其功能。
对象和接口
COM 对象通过接口公开其功能,接口是成员函数的集合。 COM 接口定义组件的预期行为和职责,并指定一个强类型协定,该协定提供一小组相关操作。 COM 组件之间的所有通信都通过接口进行,并且通过组件接口公开组件提供的所有服务。 调用方只能访问接口成员函数。 除非在接口中公开内部状态,否则调用方无法使用内部状态。
接口是强类型。 每个接口都有自己的唯一接口标识符(名为 IID),这样就消除了与人类可读名称可能发生的冲突。 IID 是全局唯一标识符 (GUID),此标识符与开放软件基金会 (OSF) 分布式计算环境 (DCE) 定义的通用唯一 ID (UUID) 相同。 创建新接口时,必须为该接口创建新的标识符。 当调用方使用接口时,它必须使用唯一标识符。 此显式标识可消除会导致运行时失败的命名冲突,从而提高稳健性。
定义新接口时,可以使用接口定义语言 (IDL) 创建接口定义。 从此接口定义中,Microsoft IDL 编译器会生成标头文件供使用接口的应用程序使用,并生成源代码来处理远程过程调用。 Microsoft 提供的 IDL 基于 DCE IDL 的简单扩展,这是基于远程过程调用 (RPC) 的分布式计算的行业标准。 IDL 是可方便接口设计人员的工具,不是 COM 互操作性的核心。 使用 IDL 时,无需为每个编程环境手动创建标头文件。
在 COM 接口中很少使用继承。 COM 仅支持接口继承以重用与基接口关联的协定。 COM 不支持选择性继承;因此,如果一个接口继承自另一个接口,则它包括基接口定义的所有函数。 此外,接口仅使用单重继承而不是多重继承从基接口获取函数。
接口实现
不能单独创建 COM 接口的实例。 而是创建实现接口的类实例。 在 C++ 中,COM 接口建模为抽象基类,这意味着接口是仅包含纯虚拟成员函数的 C++ 类。 C++ 库会从一个或多个接口继承成员函数签名、覆盖每个成员函数并为每个函数提供实现,从而实现 COM 对象。
可以使用任何支持函数指针概念的编程语言来实现 COM 接口。 例如,在 C 中,接口是一个结构,其中包含指向函数指针表的指针,此结构用于接口中的每个方法。
实现接口时,类必须为接口中的每个函数提供实现。 如果类在接口函数中无事可做,则实现可以是单个 return 语句。
COM 类可使用唯一的 128 位类 ID (CLSID) 标识,该 ID 将类与文件系统中的特定部署相关联,对于 Windows 而言这是 DLL 或 EXE。 CLSID 是 GUID,这意味着没有其他类具有相同的 CLSID。 使用唯一类标识符可防止类之间发生名称冲突。 例如,两个不同的供应商可以编写名为 CStack 的类,但两个类都具有唯一的 CLSID,因此可避免出现任何冲突。
可以使用 CoCreateGuid 函数或使用在内部调用此函数的 COM 创作工具(如 Visual Studio)获取新的 CLSID。
IUnknown 接口
所有 COM 接口都继承自 IUnknown 接口。 IUnknown 接口包含基本 COM 操作,可实现多态性和用于实例生存期管理。 IUnknown 接口有三个成员函数,名为 QueryInterface、AddRef 和 Release。 要实现 IUnknown 接口,需要所有 COM 对象。
QueryInterface 成员函数为 COM 提供多态性。 调用 QueryInterface 以在运行时确定 COM 对象是否支持特定接口。 如果 COM 对象实现请求的接口,则返回 ppvObject 参数中的接口指针,否则返回 NULL。 QueryInterface 成员函数支持在 COM 对象支持的所有接口之间导航。
COM 对象实例的生存期由其引用计数控制。 IUnknown 成员函数 AddRef 和 Release 控制计数。 AddRef 会递增计数,而 Release 会递减计数。 当引用计数达到零时,Release 成员函数可能会释放实例,因为没有调用方在使用它。
客户端/服务器模型
一个 COM 类可实现许多 COM 接口。 实现由调用方与 COM 类实例交互时运行的二进制文件组成。 COM 支持在不同应用程序中使用类,包括在不了解特定类的情况下编写的应用程序。 在 Windows 平台上,类存在于动态链接库 (DLL) 或其他应用程序 (EXE) 中。
在其主机系统上,COM 维护系统上安装的 COM 对象的所有 CLSID 的注册数据库。 注册数据库是每个 CLSID 与存放相应类的 DLL 或 EXE 的位置之间的映射。 只要调用方想要创建 COM 类的实例,COM 就会查询此数据库。 调用方只需知道 CLSID 即可请求类的新实例。
COM 对象与其调用方之间的交互建模为客户端/服务器关系。 客户端是从系统请求 COM 对象的调用方,而服务器是存放向客户端提供服务的 COM 对象的模块。
COM 客户端是将 CLSID 传递给系统以请求 COM 对象实例的任何调用方。 创建实例的最简单方法是调用 COM 函数 CoCreateInstance。
CoCreateInstance 函数会创建指定 CLSID 的一个实例,并返回客户端所请求类型的接口指针。 客户端负责管理实例的生存期,方法是在客户端使用完实例后调用其 Release 函数。 若要根据单个 CLSID 创建多个对象,请调用 CoGetClassObject 函数。 若要连接到已创建且正在运行的对象,请调用 GetActiveObject 函数。
COM 服务器向系统提供 COM 实现。 服务器将 CLSID 与 COM 类相关联,存放类的实现,实现用于创建类实例的类工厂,并可用于卸载服务器。
COM 服务器与提供给系统的 COM 对象不同。
若要启用创建 COM 对象,COM 服务器必须提供 IClassFactory 接口的实现。 客户端可以调用 CreateInstance 方法,以请求 COM 对象的新实例,但通常将此类请求封装在 CoCreateInstance 函数中。
可以将 COM 服务器部署为在运行时加载到客户端进程中的共享库(Windows 平台上的 DLL),或部署为可执行模块(Windows 平台上的 EXE)。
相关文章:
windows C++- Com技术简介(上)
在介绍C和winrt与COM组件技术的关系之前,有必要介绍一下com组件技术,这项技术比较古老,但是它一直作为windows的基石存在。COM 是一类独立于平台且面向对象的分布式系统,用于创建可交互的二进制软件组件。 COM 技术是 Microsoft O…...
Jenkins持续集成工具学习
一、从装修厨房看项目开发效率优化 二、持续集成工具 三、JavaEE项目部署方式对比 四、JenkinsSVN持续集成环境搭建 五、JenkinsGitHub持续集成环境搭建...
Redis:查询是否包含某个字符/字符串之三
上一篇:Redis:查询是否包含某个字符/字符串之二-CSDN博客 摘要: 遍历key,在跟进value的类型遍历value是否包含指定字符串 search_strings ,这里使用redis-py库,默认只能处理utf-8编码,如果存在…...
【Redis】数据类型详解及其应用场景
目录 Redis 常⻅数据类型预备知识基本全局命令小结 数据结构和内部编码单线程架构引出单线程模型为什么单线程还能这么快 Redis 常⻅数据类型 Redis 提供了 5 种数据结构,理解每种数据结构的特点对于 Redis 开发运维⾮常重要,同时掌握每种数据结构的常⻅…...
PARA-Drive:设计并行模型实现端到端自动驾驶
论文链接 https://openaccess.thecvf.com/content/CVPR2024/papers/Weng_PARA-Drive_Parallelized_Architecture_for_Real-time_Autonomous_Driving_CVPR_2024_paper.pdfhttps://openaccess.thecvf.com/content/CVPR2024/papers/Weng_PARA-Drive_Parallelized_Architecture_fo…...
vs2022 x64 C/C++和汇编混编 遇到的坑
vs2022 x64 C/C和汇编混编 遇到的坑 遇到的问题二、问题复现1.出错代码2.问题分析2.1 堆栈对齐问题 3.解决方案 总结奇数和偶数个寄存器的影响为什么 sub rsp, 8 对奇数个寄存器有用?结论 遇到的问题 0x00007FFFFAE24A29 (msvcp140.dll)处(位于 TestCompileConsole…...
PHP概述、环境搭建与基本语法讲解
目录 【学习目标、重难点知识】 什么是网站? 1. PHP 介绍 1.1. PHP 概述 1.1.1. PHP 是什么? 1.1.2. PHP 都能做什么? 1.2. PHP 环境搭建 1.2.1. PhpStudy 2. PHP 基本语法 2.1. PHP 语法入门 2.1.1. 第一个 PHP 程序 2.1.2. PHP …...
实现信创Linux麦克风摄像头录制(源码,银河麒麟、统信UOS)
随着信创国产化浪潮的来临,在国产操作系统上的应用开发的需求越来越多,其中一个就是需要在银河麒麟或统信UOS上实现录制摄像头视频和麦克风声音,将它们录制成一个mp4文件。那么这个要如何实现了? 一. 技术方案 要完成这些功能&a…...
深度学习9--目标检测
1.概念介绍 目标检测不仅可以检测数字,而且可以检测动物的种类、汽车的种类等。例如,自动驾驶车辆需要自动识别前方物体是车辆还是行人,需要自动识别道路两 旁的指示牌和前方的红绿灯颜色。对于自动检测的算法,有两个要求…...
第131天:内网安全-横向移动Kerberos 攻击SPN扫描WinRMWinRSRDP
案例一:域横向移动-RDP-明文&NTLM RDP利用的三种方式 1.直接在当前被控主机上进行远程连接 2.建立节点进行连接 3.端口转发,(访问当前主机的2222端口等于访问目标的3389) 第一种方式(动静太大) 直接利用被控主机进行远程连接…...
微信小程序的四种弹窗使用
在做小程序的过程中,弹窗也算是非常实用的功能了,这几天写的几个功能就用到了弹窗,也可能是初学者的问题,比较菜,想找一个可以带图片的自定义的弹窗,,这里简单介绍一下官方封装好的四个弹窗…...
我的第一个CUDA程序
MatAdd算法 实现两个矩阵对应元素相加 #include <stdio.h> #include <stdlib.h>// 矩阵加法函数 void MatAdd(int height, int width) {// 在主机内存中为 A、B 和 C 分配内存float* A (float*)malloc(height * width * sizeof(float));float* B (float*)malloc…...
workerman下的webman路由浏览器跨域的一种问题
软件版本 "php": ">7.2", "workerman/webman-framework": "^1.5.0",问题情景 使用“分组路由”做API接口前后端分离跨域,在接口测试工具调试是能正常获取数据的;但在网页浏览器上调试就遇到了CORS、404的错…...
Windows11 -MASKRCNN-部署测试
文章目录 Detectron2环境配置搭建python 环境安装Cuda \CUDNN 、PyTorch、 torchvision、cudatoolkit1、Cuda \CUDNN2、 PyTorch、 torchvision、cudatoolkit进入python测试:错误信息 3、detectron2环境在安装detecteron中,遇到报错:编译的时…...
函数(子程序)的常见、易混淆概念详解【对初学者有帮助】
C语⾔中的函数也被称做子程序,意思就是⼀个完成某项特定的任务的⼀小段代码。 C语⾔标准中提供了许多库函数,点击下面的链接可以查看c语言的库函数和头文件。 C/C官⽅的链接:https://zh.cppreference.com/w/c/header 目录 一、函数头与函…...
TiDB-从0到1-DM工具
TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容TiDB-从0到1-数据导出导入TiDB-从0到1-BR工具 一、DM原理 支持全量抽取数据\检测新的数据变化同步到下游实例…...
AppScan——Web 应用安全扫描的得力工具
一、引言 在当今数字化时代,Web 应用成为企业业务的重要支撑,但同时也面临着各种安全威胁。AppScan 作为一款专业的 Web 应用安全扫描工具,为保障 Web 应用的安全性提供了有力的支持。本文将对 AppScan 进行详细介绍,包括其功能、…...
虚幻5|AI行为树,进阶篇
一,打开敌人的角色蓝图,编写以下蓝图,该蓝图只是创建一个敌人并非ai行为树 1.编写蓝图 2.打开主界面,创建一个导航网格体积,上一章都有讲,在添加体积这里面,找到导航网格体积,点击创…...
在 Spring Boot 中配置 Tomcat 监听多个端口
在现代微服务架构中,应用程序可能需要监听多个端口,以支持不同的服务或协议。Spring Boot 提供了灵活的配置选项,使得这一需求变得简单而高效。本文将介绍如何在 Spring Boot 中配置 Tomcat 以监听多个端口,并简要说明其中一些关键…...
stm32f407新建项目工程及烧录
1、新建一个文件夹,打开keil5将项目工程放入文件夹中 2、弹出选择对应型号设备 3、弹出选择对应库 可以看见出现下图:感叹号表示有错 最后如图所示:点击ok就行了 4、创建对应的文件夹存放文件 4、建立main.c 5、添加对应的设置 最后写一个空白…...
c++中加不加const的值传递和引用传递的区别
文章目录 可以修改参数值的比较值传递(int x)和引用传递(int &x)使用const不修改参数值的比较值传递(const int x)和引用传递(const int &x)1. const int x 示例2. const int &x 示例 可以修改参数值的比较值传递(int x)和引用传递(int &x) #include <iost…...
Qt的窗口设置
本文介绍Qt的窗口设置。 采用Qt开发界面程序,会涉及到窗口的设置,如窗口标题栏是否显示,是否有最小,最大化按钮等,窗口当前显示最小化,最大化等。本文简要介绍常用的窗口设置方法。 1.窗口属性 窗口属性…...
51单片机-LCD1602显示屏
简介 是一个液晶显示屏,通过电压对显示区域进行控制,有电就显示。 能够同时显示32个字符,分为两行,一行显示16个字符。可以显示的内容只能是字母、数字或者一些特殊符号。 使用ASCII码来让LCD1602来显示对应的字符。 电路图 …...
多模态分析代理 MAIA:多智能体解决 视觉模型 黑盒问题
多模态分析代理 MAIA:多智能体解决 视觉模型 黑盒问题 论文:https://arxiv.org/pdf/2404.14394 代码:https://github.com/multimodal-interpretability/maia 提出背景 神经网络方法提取的特征,没有可解释性。 数据在通过多个层…...
AT360-6T杭州中科微单频高精度授时模块场景应用
AT360-6T是一款高性能多系统卫星定位授时模块,基于自主研发的北斗多系统SOC芯片,可以同时接收中国的BDS(北斗二号和北斗三号)、美国的GPS、俄罗斯的GLONASS、欧盟的 GALILEO 和日本的QZSS等多个卫星导航系统的GNSS信号来实现多系统联合定位授时ÿ…...
Python酷库之旅-第三方库Pandas(081)
目录 一、用法精讲 336、pandas.Series.str.rpartition方法 336-1、语法 336-2、参数 336-3、功能 336-4、返回值 336-5、说明 336-6、用法 336-6-1、数据准备 336-6-2、代码示例 336-6-3、结果输出 337、pandas.Series.str.slice方法 337-1、语法 337-2、参数 …...
C语言基础⑩——构造类型(结构体)
一、数据类型分类 1、基本类型 整数型 短整型:short(2个字节);整型(默认):int(4个字节);长整型:long(8个字节)…...
宝兰德荣获openEuler项目群青铜捐赠人称号,共筑开源生态繁荣新篇章
近日,开放原子开源基金会正式公布了新增捐赠人名单,宝兰德凭借在开源领域的卓越贡献与深厚实力,被授予openEuler项目群青铜捐赠人称号。 开放原子开源基金会是致力于推动全球开源事业发展的非营利机构,于2020年6月在北京成立。开放…...
【Python单元测试】学习笔记3
文章目录 08.PyTest框架什么是PyTestPyTest的优点PyTest的测试环境PyTest常用参数跳过测试 09.PyTest fixture基础PyTest fixture定义和使用引用多个Fixture 10. conftest.pyconftest.py的用途 11. 参数化测试用例为什么需要参数化测试用例使用parameterizer插件实现使用pytest…...
OpenSSL源码编译及Debug
** 1. 环境 Linux 5.19.0-14-generic 22.04.1-Ubuntu 2. 所需工具 gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04) cmake version 3.22.1 3. 步骤 3.1 获取openssl源码 方法可以git clone获得源码,或者直接去GitHub上下载压缩包,GitHub网址…...
深圳建设工程交易网站官网/百度广告大全
题意:给了一个矩阵图,要求使用回路把图中的树全部吃掉的方案树,没有树的点不能走,吃完了这个点也就没有了,走到哪吃到哪 用插头dp搞 #include <iostream> #include <algorithm> #include <cstdio> #include <…...
徐州鸿美网站建设/网站分析案例
说实话,还真有点紧张 毕竟刚毕业一年吗,上一家公司 主要是入门,而且是行业软件。然而这家公司有些不同,电子商务,互联网转载于:https://www.cnblogs.com/haihang/p/3498753.html...
wordpress无法找到该页/刷网站排名软件
QQ自带了一个接口,只要是使用手机打开该网址,就会弹出QQ对话框: http://qm.qq.com/cgi-bin/qm/qr?k 使用手机打开该网址可以进行测试:http://qm.qq.com/cgi-bin/qm/qr?k2/5FwXkAy4/UqlMOaqSUVglaDn/RaVy 该脚本HTML源码如下&a…...
alexa全球网站排名分析/中铁建设集团有限公司
我们知道C中有复制构造函数的概念,C#其实也有复制构造函数的,但平时我们一般没有提到这个说法,而且基本上不这么用.C#中常用到的克隆函数.它们实现的功能基本类似,都是拷贝一些值.但复制构造函数是在调用构造函数实例化一个类时直接拷贝另外一个对象的值,而克隆函数是等你实例化…...
电商app开发多少钱/广州关于进一步优化疫情防控措施
>>> CentOS 7.0默认使用的是firewall作为防火墙,使用iptables必须重新设置一下1、直接关闭防火墙systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动 2、设置 iptables serviceyum…...
常州网站推广/北京网站开发
动态树问题。 维护一个森林,支持树上动态查询、修改、删边、加边、换根等等,但始终保持是一颗树。 我学的主要是路径查询和修改。貌似路径和子树不能兼顾…但有一个很厉害的数据结构叫Top Tree,能同时兼顾,听起来好厉害…...