zoukankan      html  css  js  c++  java
  • COM组件宏观认识

    一直搞不清楚COM到底是个什么东西,记录一些个人感想,可能很多错误的,慢慢消化.

    一.宏观认识:

    1.COM(组件对象模型)是一种标准,规则,要求,即即于建筑设计指标要求.

    2.语言无关性,因为是建立在二进制基础上的,也就是说客户调用COM组件时只能看到二进制而看不到未经编译的源代码程序,因此就不用管用什么语言编写的COM组件了.只要该语言编写的东西符合COM的标准就可以了.就相当于不用管房子是什么材料建成的,只要满足坚固安全保温通透漂亮舒适就可以了一样.

    3.接口是一组相关函数的集合,记住是集合,是一种独特的数据结构.用关键字interace修饰,大写I开头的标识符表示.COM组建被调用时,COM客户只能看到接口,而接口的实现类对客户是隐藏的.客户要使用COM的功能,就必须找到接口的指针,通过接口指针调用接口函数来实现功能.每个接口都对应着一个128位的GUID(全局统一标识符).当COM组建在计算机中注册后,这个GUID作为公共变量保存在计算机的注册表中,这样,通过GUID计算机就能够找个这个接口了(通过调用CoCreateInstance()函数).

    4.COM组件,作为COM接口,COM类及其关系的统称,以dll或exe形式存在.每个COM组件都对应一个GUID号,它的作用是作为该组建的唯一引用,存放在计算机的注册表中,供其他使用该COM组建的程序查找到该组建.因此,COM组件注册的过程就是将组建GUID注册到注册表的过程.

    5.COM组件,COM接口和COM类都有唯一的GUID值.

    6.COM类实现了COM接口,而每个COM接口都必须继承自IUnknown接口,这就是说,每个接口都可以通过quryinterface()函数查找到其他的接口指针.因为所有的IUnknown都是同一个.

    二.组件的使用:

    window系统API有个函数叫CoCreateInstance()函数,用于创建组建,返回所需接口指针.

    HRESULT _stdcall  CoCreateInstance(REFCLSID rclsid,

                            LPUNKNOWN pUnkOuter,

                            DWORD dwClsContext,

                            REFIID riid,

                            LPVOID * ppv);

    rclsid
    [in] 用来唯一标识一个对象的CLSID(128位),需要用它来创建指定对象。即组件的CLSID值,也就是组件类的CLSID.
    pUnkOuter
    [in] 如果为NULL, 表明此对象不是聚合式对象一部分。如果不是NULL, 则指针指向一个聚合式对象的IUnknown接口。一般为NULL
    dwClsContext
    [in] 组件类别. 可使用CLSCTX枚举器中预定义的值.
    可选取值如下:
    CLSCTX_INPROC_SERVER
    创建在同一进程中运行的组件。为能够同一进程中运行,
    组件必须是在DLL中实现的。
    CLSCTX_INPROC_HANDLER
    创建进程中处理器。一个进程中处理器实际上是一个
    只实现了某个组建一部分的进程中组件。该组件的其他部分将
    由本地或远程服务器上的某个进程外组件实现。
    CLSCTX_LOCAL_SERVER
    创建一个在同一机器上的另外一个进程中运行的组件。
    本地服务器是由exe实现的。
    CLSCTX_REMOTE_SERVER
    创建一个在远程机器上运行的组件。此标志需要分布式
    COM正常工作。
    相关的组合值:
    CLSCTX_INPROC
    CLSCTX_LOCAL_SERVER
    CLSCTX_INPROC_HANDLER
    CLSCTX_ALL
    CLSCTX_INPROC_SERVER
    CLSCTX_INPROC_HANDLER
    CLSCTX_LOCAL_SERVER
    CLSCTX_REMOTE_SERVER
    CLSCTX_SERVER
    CLSCTX_INPROC_SERVER
    CLSCTX_LOCAL_SERVER
    CLSCTX_REMOTE_SERVER
    riid
    [in] 引用接口标识符,用来与对象通信。即所需接口的IID值
    ppv
    [out] 用来接收指向接口地址的指针变量。如果函数调用成功,*ppv包括请求的接口指针。即返回的所需要的接口的指针
    返回值
    S_OK

    本文转载自且有示例:https://www.cnblogs.com/fangyukuan/archive/2010/06/11/1756724.html

    用ATL创建COM组件的过程:http://www.cnblogs.com/fangyukuan/archive/2010/04/09/1708651.html

    COM组件注册步骤及注册的原因:http://blog.csdn.net/jasonliao909/article/details/50505717

  • 相关阅读:
    web动静分离
    vm采用NAT方式连接时,设置静态ip
    nginx实现tcp负载均衡
    读取文件
    线程池源码分析
    mongodb操作
    bind
    Xss攻击
    json和java对象相互转换
    静态资源默认加载路径
  • 原文地址:https://www.cnblogs.com/zhuluqing/p/8540576.html
Copyright © 2011-2022 走看看