COM聚合的实现

深入理解COM组件聚合技术 在COM(Component Object Model)中,接口是定义一组方法的合约,它规定了可以对特定类型的对象执行哪些操作。接口的定义是用一种称为接口定义语言(IDL)的特殊语言进行的,然后通过某种语言的绑定(例如C++、Java等)生成特定语言的代码。接口的实现涉及编写代码以满足这些合约中定义的方法。在COM中,每个接口都必须由至少一个方法组成,并且所有接口都必须派生自一个核心接口:IUnknown。 阅读详情

聚合指的是COM对象转接客户端对某个接口的请求。

某COM对象B并不实现ISomeInterface接口,但是可以通过调用某个内部COM对象A来支持该接口。意思是指,当客户端调用B所支持的接口IOtherInterface查询ISomeInterface时,直接将对象A的ISomeInterface接口指针传出去。

实现聚合的关键是COM对象在被聚合时的QueryInterface的处理。按照COM规范,通过接口查询到的IUnknown接口必须唯一。所以即便B对象不实现ISomeInterface接口,但是调用该接口查询到的IUnknown接口应当跟通过IOtherInterface查询到的一样。但因为实际上ISomeInterface是内部对象A的接口,所以为了符合规范,必须对A被聚合的情况进行特殊处理。

内部对象可以在外部对象初始化时通过CoCreateInstance函数创建,该函数的声明为:

       STDAPI CoCreateInstance(
  REFCLSID rclsid,
  LPUNKNOWN pUnkOuter,
  DWORD dwClsContext,
  REFIID riid,
  LPVOID * ppv
);

其中pUnkOuter指针用于指明该组件被聚合,并将外部对象的IUnknown接口指针传进来。这样,在内部对象进行查询的时候,以及AddRef,Release时,可以先判断外部IUnknown指针是否为空,若不为空,就要通过外部IUnknown指针调用QueryInterface,以及AddRef和Release。

手把手教你用芯驰X9HP驱动MAX96755/MAX96752点亮智能座舱仪表屏(附完整寄存器配置表) 本文详细介绍了如何使用芯驰X9HP驱动MAX96755/MAX96752实现智能座舱仪表屏的完整开发流程,包括硬件架构解析、关键寄存器配置、Linux BSP集成及调试技巧。通过实战指南和完整寄存器配置表,帮助开发者快速掌握驱动开发核心技术,提升智能座舱系统的显示性能与稳定性。 阅读详情

相关推荐

pikachu靶场: 暴力破解第四关(token防爆破)

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 同时将此 Token 返回给客户端。此外,Token 是有时效的,一段时间之后或下一次请求时用户需要重新验证。

X_shiguang的博客 1720

COM 的聚合

 今天看了一会COM的聚合 写下心得。说得有点通俗。 先说下聚合的定义:就是一个组件A只实现了IX接口,在A内部又可以使用B组建的IY接口。如果我是客户,使用组件A, 俺既可以掉IX接口,又可以掉IY接口,我可不知道有组件B的存在哦。 聚合不能象包容那样 直接转发B对IY接口的请求,因为包容A组建实现了IY:A和B共用一套QueryInterface();聚合就有2套QueryIn

566

论文选题难?7种AI加持的万能选题法(全专业通用+工具实测)

AI时代学术选题新范式:7大智能方法破解研究痛点 传统选题方法面临范围失控、资料难寻、创新不足三大痛点,本文提出AI赋能的7种选题方法论: 1.现象+群体法:自动抓取热点与人群特征 2.理论+场景法:经典理论与新兴场景匹配 3.技术+问题法:前沿技术与领域痛点结合 4.对比+变量法:时空维度与变量关系分析 5.热点+理论法:事件传播与理论深挖融合 6.微调+变量法:已有选题变量置换创新 7.AI全流程法:关键要素智能迭代生成 同时警示AI使用的伦理边界,需规避虚构文献、伪造数据等风险,并提供针对本科生、研究

Conan_0728的博客 1881

6.COM可重用性——聚合

聚合无论是原理还是实现都是COM组件中比较复杂和难以理解的地方,这里通过详细的讲解和在代码中给出详细的注释,指出常见注意点,可对比学习COM聚合技术。

文洲的专栏 4369

别再只会调速度了!用STM32的定时器中断精准控制伺服电机转角(避坑指南)

本文详细介绍了如何利用STM32的定时器中断和PWM输出实现伺服电机的精准转角控制,避免常见的速度控制误区。通过硬件配置、脉冲计数逻辑和优化技巧的实战讲解,帮助开发者掌握高精度位置控制方法,适用于工业自动化和机器人控制等场景。

weixin_42531163的博客 414

【ubuntu】如何搭建AFTR+B4环境

为何要使用ipv6 目前ipv4地址已经不够用了,而IPv6采用128位地址长度,几乎可以不受限制地提供地址。而且ipv6具有更高的安全性。 主流的ipv6方案 1.双栈方案 :所有设备同时支持IPv4/IPv6协议栈,核心理念在于其传送网同时支持IPv4和IPv6 2.DS-Lite方案 :IPv4‐in‐IPv6 隧道和 NAT 这两个基本技术,同时支持IPV4与IPV6,对于ipv4用户,可以通过ipv6隧道与ipv4业务平台实现通信;针对ipv6用户,可直接通过ipv6网络通信。 3.6RD方案 :

weixin_43863426的博客 2723

COM原理与实现之二: 聚合

COM原理与实现之二: 聚合C++没有同聚合等价的特性。聚合实际上是继承性的一种动态形式。而C++的继承总是静态的,是实现继承。COM是接口继承,通过聚合接口,可以做成动态配置。研究COM,主要是利用接口继承的灵活性构筑强大的系统:可配置、可插拔、可脚本化。本文不讲太多理论,详细原理参考[COM技术内幕]这本书。关于[COM技术内幕],很多内容过时了,比如注册表,类厂之类的。我更关心COM思想所蕴

恒 6892

基于卷积神经网络的人脸表情识别(JAFFE篇)

1.win10/11操作系统2.python3.7以上3.tensorflow2.4以上版本(2.0其它版本需要微调)4.内存12G,显卡4G以上(没有独显倒是也能跑...)(这个可爱的妹子就是JAFFE数据集中的图片)

小林同学的计算机学习 5913

COM包容和聚合

   包容和聚合实际上是一个组件使用另一个组件的技术。对于这两个组件,可以把第一个组件称为外部组件,被使用组件称为内部组件。      1、包容简介      COM包容同C++包容是相似的。但是在COM中,同其他内容类似,包容也是在接口级完成的。外部组件包含指向内部组件接口的指针。此时外部组件只是内部组件的一个客户,它将使用内部组件的接口来实现自己的接口。      外边组件也可以通过将调...

iteye_16714的博客 354

手机银行应用架构设计

网上银行借助互联网、移动通信网络等技术向客户提供金融服务,易受到通讯层面的安全威胁,金融机构应从通讯协议、安全认证、通信链路安全等层面,采取措施有效应对相关风险。网上银行系统服务器端提供网上银行应用服务和核心业务处理功能,金融机构应充分利用物理环境、通信网络、计算环境等领域的防护技术,在攻击者和受保护的资源间建立多道严密的安全防线。 网上银行除直接向用户提供金融服务外,也可能与外部机构开展业务合作。在网上银行系统设计、开发、部署和运营过程中,应充分考虑外部机构的系统可能存在的安全风险,并针对各类风险进行有效

银行信息系统应用架构详解 4830

Lion优化器试验笔记

Lion优化器试验笔记

jacke121的专栏 847

一个使用MFC实现Com聚合的例子

在网上搜Com聚合的例子,发现都比较少,大多偏于原理性的介绍。由于模拟MFC 和真正使用MFC时,在查询IUnknown接口时,流程上有所不同,所以模拟MFC的方式与直接从CCmdTarget派生时,在流程上有较大的差别。即使懂了Com聚合的原理,也可能无法直接使用MFC实现Com 聚合,本人经过一番摸索,终于实现了直接使用MFC实现COM聚合。

聪明的狐狸 1414

1.4 KFD 设备文件的获取与驱动握手协议

本文分析了OpenClose模块中libhsakmt与KFD内核驱动建立通信的过程。首先通过hsaKmtOpenKFD()函数打开/dev/kfd设备文件,建立用户态与内核态的通信通道。随后通过AMDKFD_IOC_GET_VERSION ioctl命令完成版本握手,确认双方的接口兼容性。KFD驱动采用Major.Minor二级版本号体系,当前主要版本为1,从1.1演进到1.19不断添加新功能。整个过程构成了用户态与内核态之间的"建连协议",是所有后续GPU操作的基础前提。

图形/计算GPU的驱动与虚拟化技术分享园地 605

com 聚合的实现

COM接口聚合实现解惑(C++虚表) 标签: c++nullclass工作serverc 2009-10-12 17:37 1829人阅读 评论(8) 收藏 举报 本文章已收录于: 分类: Windows开发(1) 作者同类文章X C/C++(1) 作者同类文章X

ICE_CHB的博客 419

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ATL 实现com的聚合

com聚合是包容的一种特例,目的是最大化的实现功能模块话,降低组件间的耦合性。 第一步:          通过ATL创建com外部组件TestOutCom.dll,在其内部创建接口包装类CCMyOuterCom,并实现其对应的接口ICMyOuterCom                 之后点击“完成”;并在接口中实现“GetOuterMethord”方法,方便

FrankieWang008的专栏 3653

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

用MFC写的COM如何实现包容或聚合?

实现包容只需加一个接口指针的成员变量,然后在固定的地方初始化它(ATL中可以在FinalConstructor()(可能记错)中初始化接口指针,即调用CoCreateInstance),但是在MFC中并没有为CCmdTarget提供类似FinalConstructor的虚函数(至少我不知道有这样的函数),因此在MFC中如果找不到其他的形式(如用CWnd的派生类来实现COM组件,则可在WM_CREA

medvision的专栏 1371

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

COM对象聚合的原生态实现(非向导)

之前我有一篇博客是介绍如何使用ATL向导生成对象聚合的,那时候实现的快感掩盖了我无知的现实,现在重新拿起COM原理与应用这本书,我想还是全手工自己手写一遍吧,于 是就有了这篇博文,关于对象聚合,我想只是代码复用的一种,如果有两个接口ISome和IOther两个接口分别完成不同的功能,而那么对象聚合的含义就是在外部对象ISome中声 明所有的接口,但是在非ISome的功能函数中调用的是接口IOt

dasgk的专栏 857

COM实现聚合所使用的C++技巧

COM聚合作为COM实现接口复用的一种手段, 在进行多接口转发的时候是一种有效而快速的方法; 不过要在转发之后保证接口函数的语意保持一致, 必须使用一些特定的技巧, 下面的代码就演示了COM在实现聚合时所使用的技巧:class Base{public:    virtual void Output()    {        printf("Base::Output/n")

阮建辉的专栏 3529

COM接口聚合实现解惑(C++虚表)

本文转自http://blog.youkuaiyun.com/nobugtodebug/archive/2009/10/12/4659351.aspx              最近看潘爱民的《COM原理与应用》,看到接口的聚合实现时,产生一个疑惑。COM的这个特性的背后隐藏着一个关于C++虚表的知识点。如果对C++的虚表没有一定的认识就会被绕进去,被搞得稀里糊涂。经过和朋友的一番探讨总算搞清楚。特整

理性的幻想 1034

COM原理与应用中关于聚合实现的纪要

  在第一次看关于聚合实现的时候年利觉得有点晕,又仔细琢磨了下,现在基本上搞明白了里面的曲曲折折,现记录一下当时不太理解的地方     (1)HRESULT CA::NondelegationQueryInterface(const IID& iid, void **ppv){ if ( iid == IID_IUnknown ) { *ppv = (INondelega

red_berries的专栏 1114

一个用MFC实现Com聚合样本

ComATLATLMFCMFC MFCIUnknownMFCCCmdTargetComMFCCom MFCCOM 1. 1.1 #pragma once typedef long HRESULT; // {30DF3430-0266-11cf-BAA6-00AA003E0EED} extern const GUID CLSID_Math; //{ 0x30df3430, 0...

weixin_33674976的博客 124

COM技术内幕中聚合的实现

1. 产生的时候,会把要用到的的相关接口指针      与的指针保存下来。2. 调用的工厂方法创建,将返回一个指针。 通过得到真实的3.在产生的时候保存IUnknown接口指针,当客户调用IUnknown的接口的时候   则转接到的接口上。而真正的IUnknown的操作而在上实现4.导出后,客户在使用IUnknown还是认为在使用 因为以把相关操作转发过来了。5.在析构的时候,则调用内部组件的进行

Meuck的专栏 2499
上一篇: COM聚合的实现
下一篇: 双缓冲技术:Double Buffering
RocWay007
博客等级 码龄24年 37粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值