当初微软设计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_ROOT/CLSID/{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目录/Common/Tools/GuidGen.exe"工具产生GUID

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

GUID和UUID、CLSID、IID 区别及联系的更多相关文章

  1. 微软的COM中GUID和UUID、CLSID、IID

    摘自:http://blog.csdn.net/zhongguoren666/article/details/6711396 当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全 ...

  2. 怎样用java生成GUID与UUID

    GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随机数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...

  3. VC++ 产生GUID或UUID

    GUID 和 UUID 是一样的,表示全球唯一标识码. 下面是Windows系统中,产生GUID的一种方法(Windows API) char* GUID_Generator() { ] = {}; ...

  4. Excel生成guid、uuid

    1.Excel生成guid,uuid  格式:600d65bc-948a-1260-2217-fd8dfeebb1cd =LOWER(CONCATENATE(DEC2HEX(RANDBETWEEN(, ...

  5. java 生成GUID与UUID

      java 生成GUID与UUID CreateTime--2018年5月31日16点29分 Author:Marydon import java.util.UUID; public static ...

  6. <转>Excel生成guid、uuid

    Excel生成guid.uuid  原文地址:https://www.cnblogs.com/jory/p/7718305.html  1.Excel生成guid,uuid  格式:600d65bc- ...

  7. C++:在程序中获取全球唯一标识号(GUID或UUID)

    Windows:使用CoCreateGuid函数(GUID) #include <objbase.h> #include <stdio.h> #define GUID_LEN  ...

  8. 【转】C++:在程序中获取全球唯一标识号(GUID或UUID)

    Windows:使用CoCreateGuid函数(GUID) #include <objbase.h> #include <stdio.h> #define GUID_LEN ...

  9. VS使用GUID(UUID的基础知识)

    UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定. UU ...

随机推荐

  1. springboot在集成mybatis的时候老是报错 The server time zone value '�й���׼ʱ��' is unrecognized

    我已经解决了,感谢万能网友. 解决办法参见:https://blog.csdn.net/yunfeng482/article/details/86698133

  2. phpmyadmin导入大容量.sql文件

    phpmyadmin导入大容量.sql文件 在phpmyadmin目录文件夹下建立一个文件夹,如importSqlFile 将想要导入的sql文件放入importSqlFile文件夹中 打开confi ...

  3. Ubuntu无法安装nginx

    1.问题Reading package lists... DoneBuilding dependency tree       Reading state information... DoneSom ...

  4. python修炼之路---面向对象

    面向对象编程 面向对象编程:使用类和对象实现一类功能. 类与对象 类:类就是一个模板,模板里可以包含多个函数,函数里实现一些功能. 对象:是根据模板创建的实例,通过实例对象可以执行类中的函数. 面向对 ...

  5. share point 字段类型

    Type (as shown on the Create Column page) Field Type Notes MSDN Links Single line of text Type=”Text ...

  6. Python 时间序列

    Python - 时间处理模块 datetime - 常用模块 官方文档 time calendar

  7. python3中OpenCV imwrite保存中文路径文件

    原先一段将特征值保存为图片的代码,这部分学生的电脑上运行没有生成图片 代码的基本样子是: import os import cv2 import numpy as np def text_to_pic ...

  8. gitlab docker中postgresql远程访问配置

    1.配置postgresql远程访问 配置postgresql远程访问,需要修改两个文件,在gitlab-ce的docker中位置为 /var/opt/gitlab/postgresql/data 首 ...

  9. 树莓派VI命令大全(附vim使用异常,卸载重新安装步骤)

    vi有3个模式:插入模式.命令模式.低行模式. 插入模式:在此模式下可以输入字符,按ESC将回到命令模式. 命令模式:可以移动光标.删除字符等. 低行模式:可以保存文件.退出vi.设置vi.查找等功能 ...

  10. #381 Div2 Problem C Alyona and mex (思维 && 构造)

    题意 : 题目的要求是构造出一个长度为 n 的数列, 构造条件是在接下来给出的 m 个子区间中, 要求每一个子区间的mex值最大, 然后在这 m 个子区间产生的mex值中取最小的输出, 并且输出构造出 ...