专栏首页闷骚的程序员COM 原理与应用学习笔记

COM 原理与应用学习笔记

略读完了潘爱民老师的《COM 原理与应用》一书,将书中个人认为一些比较重要的概念摘引如下,附少量自己的标注。

COM 对象的接口原则

书中总共列举了五条原则,其它几条我觉得理所当然,符合我「想当然」中的理解,故略去不记,这一条认为比较实用。

对于同一个对象的不同的接口指针,查询得到的 IUnknown 接口必须完全相同。也就是说,每个对象的 IUnknown 接口指针是唯一的,因此,对两个接口指针,我们可以通过判断其查询到的 IUnknown 接口是否相等来判断它们是否指向同一个对象。

反之,如果查询的不是 IUnknown 接口,而是其它接口,则通过不同的途径得到的接口指针允许不一样。这就允许有的对象可以在必要的时候才动态生成接口指针,当不用的时候可以把接口指针释放掉。

客户程序创建组件对象

包容和聚合

包容

对象 B 包容对象 A,对象 B 使用包容方式提供接口 InterfaceA,则对象 B 需要实现 InterfaceA,只不过在实现里只是将调用全部转发给了对象 A 的对应函数。

对象包容示意图:

聚合

对象 B 聚合对象 A,对象 B 使用聚合方式提供接口 InterfaceA,则对象 B 不需要实现 InterfaceA,直接暴露对象 A 的 InterfaceA。

对象聚合示意图:

对象 A 也需要为支持聚合做一些事情——实现一个委托 IUnknown 接口和一个非委托 IUnknown 接口。

按照通常使用方式实现的 IUnknown 为非委托 IUnknown,而委托 IUnknown 在不同的情况下有不同的行为:当对象被正常使用时,委托 IUnknown 把调用传递给对象的非委托 IUnknown;当对象被聚合使用时,委托 IUnknown 把调用传递到外部对象的 IUnknown 接口,即对象被创建时传递进来的 pUnknownOuter 参数,并且,这时外部对象通过非委托 IUnknown 对内部对象进行控制。

支持聚合的对象在非聚合方式下的接口示意图:

支持聚合的对象在聚合方式下的接口示意图:

进程外组件与客户程序的协作方式

代理对象用列集手段处理成员函数的参数,通过列集处理后得到一个数据包(数据流),然后通过一种跨进程的数据传输方法,比如共享内存方法,甚至是网络协议等,当数据包传输到对象进程后,存根代码用散集(列集的反过程)的方法把数据包参数解译出来,再用这些参数去调用组件对象;当组件对象成员函数返回后,存根代码又把返回值和输出参数列集成新的数据包,并把数据包传到客户进程中,代理对象接收到数据包后,把数据包解译出来再返回给客户函数,从而完成一次调用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TortoiseSVN 从 GitHub 更新时发生异常

    使用 TortoiseSVN 从 GitHub 仓库 Update 时,弹出错误提示对话框:

    mzlogin
  • 使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源

    挺久以前就有网友给我的 GitHub Pages 博客模板提 Issue,说希望能增加 CDN 用于加速静态资源的加载,由于懒,一直没有动。

    mzlogin
  • 一个 printf 引发的基础复习

    初看时,想当然了一下觉得输出就是1 1.00,后来编译出来运行一下,屏幕上却赫然是-1717986918 1.60。

    mzlogin
  • 《Head First 设计模式》笔记

    软件开发的一个不变真理:不管当初软件设计得多好,一段时间后,总是需要成长与改变,否则软件就会“死亡”。

    谛听
  • 深入理解JVM(二)——揭开HotSpot对象创建的奥秘

    对象的创建过程 当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作: 检查常量池中是否有即将要创建的这个对象所属的类的符号引用; 若常量池中没...

    大闲人柴毛毛
  • 关于对象池的一些分析

    在日常的开发工作中,我们可能使用或者听说过对象池,线程池以及连接池。本文将介绍对象池的产生缘由,具体实现细节,以及需要注意的问题。

    技术小黑屋
  • Java对象的结构与对象在内存中的结构

    当我们在Java中使用new这个指令创建一个对象的时候,对象的创建到底经过了什么样的一个过程呢?

    星如月勿忘初心
  • Java 编程思想精华总结(一)- 对象导论(上)

    程序可以通过添加新的对象使自身更适用于某特定问题。因此阅读代码其实也就是在阅读问题的描述。

    JavaEdge
  • 经典面试题-列举JSP的内置对象,同一应用中页面有哪些方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • Java设计模式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    村雨遥

扫码关注云+社区

领取腾讯云代金券