zoukankan      html  css  js  c++  java
  • com 组件的本知识

    (今日看到网络上关于"COM中GUID......"文章,写的好,故记录之.)
    当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全球唯一:

    第一种是采用和Internet地址一样的管理方式,成立一个管理机构,用户如果想开发一个COM组件的时候需要向该机构提出申请,并交一定的费用。

    第二种是发明一种算法,每次都能产生一个全球唯一的COM组件标识符。

    第一种方法,用户使用起来太不方便,微软采用第二种方法,并发明了一种算法,这种算法用GUID(Globally Unique Identifiers)来标识COM组件,GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。


    GUID的例子: 54BF6567--1007--11D1--B0AA--444553540000


    HKEY_CLASSES_ROOTCLSID{002B9E07-2E10-438F-AF1E-40E6A96F1EE4}


    在微软的COM中GUID和UUID、CLSID、IID是一回事,只不过各自代表的意义不同:


    UUID  : 代表COM


    CLSID : 代表COM组件中的类 


    IID :代表COM组件中的接口


    在程序中,实际对象数据对应的处理程序路径string往往不尽相同,比如有的放C盘有的D盘,微软想出了一个解决方案,那就是不使用直接的路径表示方法,而使用一个叫 CLSID的方式间接描述这些对象数据的处理程序路径。


    CLSID 其实就是一个号码,CLSID 的结构定义如下:


    typedef struct _GUID { 
     DWORD Data1; // 随机数 
     WORD Data2; // 和时间相关 
     WORD Data3; // 和时间相关 
     BYTE Data4[8]; // 和网卡MAC相关 
    } GUID;




    typedef GUID CLSID;  // 组件ID 
    typedef GUID IID;    // 接口ID 
    #define REFCLSID const CLSID &


    // 常见的声明和赋值方法 
    CLSID CLSID_Excel = {0x00024500,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}; 
    struct __declspec(uuid("00024500-0000-0000-C000-000000000046")) CLSID_Excel; 
    class DECLSPEC_UUID("00024500-0000-0000-C000-000000000046") CLSID_Excel; 
    // 注册表中的表示方法 
    {00024500-0000-0000-C000-000000000046}


    如果使用开发环境编写组件程序,则IDE会自动帮你产生 CLSID;


    可以用函数 CoCreateGuid() 产生 CLSID;


    使用"vc目录CommonToolsGuidGen.exe"工具产生GUID


    每一个COM组件都需要指定一个 CLSID,并且不能重名。它之所以使用16个字节,就是要从概率上保证重复是“不可能”的。但是,微软为了使用方便,也支持另一个字符串名称方式,叫 ProgID。。由于 CLSID 和 ProgID 其实是一个概念的两个不同的表示形式,所以我们在程序中可以随便使用任何一种。
    下面是 CLSID 和 ProgID 之间的转换方法和相关的函数:



    函数 功能说明 
    CLSIDFromProgID()、CLSIDFromProgIDEx() 由 ProgID 得到 CLSID。没什么好说的,你自己都可以写,查注册表贝 
    ProgIDFromCLSID() 由 CLSID 得到 ProgID,调用者使用完成后要释放 ProgID 的内存(注5) 
    CoCreateGuid() 随机生成一个 GUID 
    IsEqualGUID()、IsEqualCLSID()、IsEqualIID() 比较2个ID是否相等 
    StringFromCLSID()、StringFromGUID2()、StringFromIID() 由 CLSID,IID 得到注册表中CLSID样式的字符串,注意释放内存

  • 相关阅读:
    ‘Host’ is not allowed to connect to this mysql server
    centos7安装mysql
    further configuration avilable 不见了
    Dynamic Web Module 3.0 requires Java 1.6 or newer
    hadoop启动 datanode的live node为0
    ssh远程访问失败 Centos7
    Linux 下的各种环境安装
    Centos7 安装 python2.7
    安装scala
    Centos7 安装 jdk 1.8
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14872072.html
Copyright © 2011-2022 走看看