COM基础

2023-10-27

曾经看过潘老师的<<COM原理与应用>>的前三章,有些时间没怎么往下看了,趁这个周末休息正好把以前看过的三章重温一下,总结一下,然后继续往下学习

一.COM组件的实现

       COM组件分进程内组件和进程外组件

       进程内容组件主要是由DLL来实现,客户程序和组件程序运行在同一个进程地址空间。

       进程外组件文件格式为exe,运行在和客户程序不同的进程空间甚至不在同一台机器上。

二.GUID,CLSID,IID

       GUID:128位的全局唯一标示符,这是一个随机数,发生相重的几率非常小。

       CLSID:用来标示COM对象(COM类)的GUID

       IID:用来标示接口的GUID

三.COM组件的语言实现和内存模型

       用C++来实现COM组件目前是最合适的,因为C++的多态性,虚函数可以很好的用来实现COM的接口

       接口是一组函数的集合,而且是函数的申明的集合,没有包含实现。

       对于C++来说,用代码实现这样的接口也就是定义一个类,包含这些函数的申明(需要申明为虚函数)即可。

       对于COM组件模块来说,一个COM组件模块可以实现一个或者多个接口,对于C++来说,也就是编一些一个类集成并且实现他所IMPLEMENT的接口类的所有函数即可(其实也未必,如果你不在代码里调用这些未提供函数体实现的函数也是没由问题的)。

       如果一个COM组件实现多个接口,在C++的继承模式上不能采用虚拟继承来继承着多个接口类。 

       内存结构上来说COM组件类的对象中,存放着每一个实现的接口类的虚函数表,用于调到对应接口中的函数,并且可以用强制类型转换来返回接口指针,这个接口指针中至少包含了用来调用接口中申明的哪些函数的虚函数表。

       客户程序拿到了接口指针也就相当于可以调用包含这个接口指针的COM对象的其他接口了(通过查询接口)。

四.IUnKnown接口

       这个接口是每一个接口类的父类,提供用于管理内存,查询其他接口的函数

       1.AddRef       --增加对象的引用计数

       2.Release      --减少对应的引用计数

       3.QueryInterface    --通过IID返回对象的其他接口指针

       这三个函数式每个COM组件类必须实现的三个接口函数。

五.注册

       COM组件的注册使用WINDOWS的REGSVR32.exe提供注册的,该exe会调用COM组件中的DllRegisterServer和DllUnRegisterServer函数进行注册和反注册。

       如果是进程外组件,那么COM要求该exe支持运行参数/RegServer和/UnregServer并且对这两个参数做出处理。

六.类厂

       对于COM组件类,其创建是由COM库调用组件模块dll中的类厂对象生产组件类对象的。每个组件类都有一个对应的类厂类,类厂类实现了IClassFactory接口,这个接口作重要的函数就是CreateInstance函数,用于创建组件类对象,并且返回接口指针。

       由于类厂实现了IClassFactory接口,因此,类厂也是一个COM组件类,他的创建时有组件模块dll中的DllGetClassObject函数实现的,其中参数中的IID一般情况下是IClassFactory接口的IID,除非我们的类厂类实现了更多的接口(比如用户安全验证等)。

七.COM库

      在COM库中,有三个API函数用于对象的创建

      1.CoGetClassObject

      该函数调用com组件dll中的DllGetClassObject函数创建类厂对象,并且返回类厂接口指针(IClassFactory)

      2.CoCreateInstance

      该函数内部实际上先调用CoGetClassObject函数创建类厂对象,然后根据参数中的IID使用类厂对象的CreateInstance函数创建出组件对象,并且返回IID对应的接口指针,这些操作都是在组件内部和COM库之间进行的,客户程序相当于直接绕开类厂对象创建COM对象了。

      3.CoCreateInstanceEx

      该函数用于创建远程机器上的COM对象,暂时还未完全看懂。

       COM库的初始化:使用CoInitialize函数进行COM库的初始化。

       客户程序初始化COM库以后,就可以使用COM库提供的各种服务,在程序退出前,要调用CoUninitialize函数释放CIOM库管理的资源。

 

       进程内COM组件的卸载

       当客户程序退出前,要卸载COM对象,这是,COM库会调用组件模块dll的DllCanUnloadNow函数,该函数判断

       这个函数的调用由客户程序来进行,因为只有客户程序知道是否还需要使用该COM对象,如果不需要的话,调用COM库的CoFreeUnusedLibraries函数进行卸载。

 

八.COM库加载COM组件的流程

        目前只看懂了进程内组件的加载流程,如下:

        1.客户程序初始化COM库(CoInitialize)

        2.调用COM库的CoCreateInstance函数创建COM组件对象,返回接口指针(这一步COM库可能会LoadLibrary加载进程内组件的dll)

        3.使用接口指针完成操作

        4.客户程序调用COM库的CoFreeUnusedLibraries(COM库会调用组件dll的DllCanUnloadNow,如果返回true,则COM库使用FreeLibrary释放组件dll,并且返回true

)

        5.客户程序调用COM库的CoInitialize释放COM库资源。

 

九.HRESULT

       COM库的对象创建函数返回值很多都是这个类型的,他是一个32位整数,而不是一个资源的句柄,其31位和30位两位的值反应了函数调用的基本结果

       00  标示调用成功

       01  包含了一些信息

       10  警告

       11  错误

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

COM基础 的相关文章

随机推荐

  • 《Code_Complete_2》持续更新中......

    如何阅读这本书 这本书有意设计成使你既可以从头到尾阅读 也可以按主题阅读 1 如果你想从头到尾阅读 那么你可以直接从第2章 用隐喻来更充分地理解软件开发 开始钻研 2 如果你想学习特定的编程技巧 那么你可以从第6章 可以工作的类 开始 然后
  • 为什么美国程序员工作比中国程序员工作轻松、加班少?

    作者 LJ说 责编 伍杏玲 本文经授权转载自LJ说 ID LjNotes 先问是不是 再问为什么 难道美国的程序员就不加班吗 他们就一天八小时工作 还想来就来 想走就走 非工作时间完全找不到人 还有什么食物饮料都免费提供 让我来告诉你真实的
  • webpack

    看一下完整报错 asset static js index js 4 04 KiB compared for emit name main src main js 39 bytes not cacheable built code gene
  • 基于Neptune开发板的键盘蓝牙模块DIY指南

    本期我们带来基于润和Neptune开发板 以下简称Neptune开发板 的键盘蓝牙模块DIY指南 利用Neptune开发板支持串口和蓝牙功能等特性 将有线键盘改造成蓝牙键盘 实现一个键盘被多操作系统 终端设备识别使用的功能 达到提高工作效率
  • C++ 检测内存泄露工具 -- Windows平台

    平台 Windows7 64bit 编译器G mingw 工具 Dr Memory 项目主页 https code google com p drmemory 可能要FQ 可能会很慢 所以 可以直接按照下面官方主页给出的链接下载 我也放了一
  • 人工智能应用实例:图片降噪

    人工智能应用实例 图片降噪 场景设置 对白色背景 黑色前景的黑白图片进行降噪处理 可以假定背景部分多于前景 图1 从左往右 原图 噪声图 降噪图 降噪模型 我们可以对图片建立这样一个两层的二维模型 底层表示原图 顶层表示任意的噪声图 xi为
  • Power BI 数据模型设计及搭建——星型模型&雪花模型

    前言 之前的笔记提到了 Power BI 数据模型的核心概念 本文继续深入讨论数据模型的设计架构 同时介绍两种常用的数据模型 星型模型和雪花模型 BI 的数据模型和数仓模型有什么不同 数据仓库和Power BI中使用的数据架构模型有一些相似
  • 创建SpringBoot项目时修改Server URL(下载路径)

    使用spring initializr创建Springboot项目时 IDEA默认的Server URL为 https start spring io 使用该下载路径缺点 1 从中央仓库进行下载 下载速度慢 2 当网络不稳定时 或网络访问限
  • 《动手学深度学习 Pytorch版》 4.6 暂退法

    import torch from torch import nn from d2l import torch as d2l 4 6 1 重新审视过拟合 整节理论 详见书本 4 6 2 扰动的稳健性 整节理论 详见书本 4 6 3 实践中的
  • js去掉小数点后面多余的0

    用parseFloat 如 var a 23 8000 alert parseFloat a 结果 23 8 当然这个也有可能有想不到的结果 document write parseFloat 12dream3456 789 documen
  • 4、编写程序,根据用户输入的数字转换成相应的中文的大写数字。例如,1.23转换为“壹点贰叁”。

    Python 4 编写程序 根据用户输入的数字转换成相应的中文的大写数字 例如 1 23转换为 壹点贰叁 问题遇到的现象和发生背景 输入含有0就不会输出 问题相关代码 import jieba ChineseNum 零 壹 贰 叁 肆 伍
  • 读书:滑铁卢

    又到4月23日国际读书日 又是一年轮回 有些老朋友可能知道 TC研修实验室有一条不成文的老传统 每逢此时 都会按书年度进行读书总结 至今 已是第4个年头 只不过 是遭遇 读书滑铁卢 的一年 当我到豆瓣查看这一年的读书记录时 我震惊了 纳尼
  • 模拟CMOS集成电路设计中的电流基准源及用Cadence Virtuoso IC617设计并仿真有关电路

    前言 本文为我自己的学习笔记 属于Cadence Virtuoso系列的进阶部分 采用的软件版本是Cadence Virtuoso IC617 其他文章请点击上方 看我制作的Cadence Virtuoso专栏内容 在前面的文章中 记录了电
  • sql_model

    关于sql mode sql mode是MySQL数据库中的一个环境变量 定义了mySQL应该支持的SQL语法 数据校验等可以通过select sql mode 查看当前数据库使用的sql mode 查看当前数据库的sql mode sel
  • 汉字统计

    题目 统计给定文本文件中汉字的个数 输入格式 输入文件首先包含一个整数n 表示测试实例的个数 然后是n段文本 输出格式 对于每一段文本 输出其中的汉字的个数 每个测试实例的输出占一行 Hint 从汉字机内码的特点考虑 数据范围 无 样例输入
  • Js 逆向:微博登录

    1 先分析参数 su sp是必要的 其中su是加密后的账号 很简单就是个bs64 不再说了 2 直接搜参数 这个时候要搜代表性的 特殊的 例如pwencode 很好只有一个 两种加密 一个是RSA 一个是sha 这里判断用的是RSA 3 直
  • VUE的认识及基础语法

    VUE的认识及基础语法 我们先来了解一下什么是VUE 什么是渐进式 库 插件和框架的区别 vue从而出现了一种开发模式那就是mv 插值表达式的使用 指令 关于属性 循环 v model 自定义指令 过滤器 修饰符 v on 指令常用修饰符
  • 光线追踪(ray tracing)介绍与细节推导

    背景 最近因为找到关于光线追踪相关不错的教程 所以边学习边做记录并希望将相关资料进行分享 光线追踪作为计算机图形学中一种可以获得良好的效果的渲染算法 有着非常广泛的应用 历史背景相关的介绍可参考百度百科或者维基百科 本文中的参考资料来自于P
  • 【爬虫】JS逆向解决反爬问题系列5—sign破解

    欢迎来到我的博客 作者 秋无之地 简介 CSDN爬虫 后端 大数据领域创作者 目前从事python爬虫 后端和大数据等相关工作 主要擅长领域有 爬虫 后端 大数据开发 数据分析等 欢迎小伙伴们点赞 收藏 留言 本次博客内容将讲解关于sign
  • COM基础

    曾经看过潘老师的 lt