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

  • 相关阅读:
    在ServiceImpl层加载Spring配置文件进行测试
    MyBatis:逆向工程,实现实体类中文注释(Eclipse + MySQL)
    Linux(CentOS):开机自动启动Tomcat脚本(判断MySQL是否启动后再启)
    Linux(CentOS):设置FTP开机自动启动
    转载 PowerDesigner导出mysql数据结构
    SVN分支/主干Merge操作小记
    Quartz.NET+TopSelf 实现定时服务
    关于redis,学会这8点就够了(转)
    kafka 基础知识梳理(转载)
    Centos7 忘记密码的情况下,修改root或其他用户密码
  • 原文地址:https://www.cnblogs.com/zhuluqing/p/8540576.html
Copyright © 2011-2022 走看看