微软COM中GUID和UUID、CLSID、IID

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情


  当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全球唯一:

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

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

第一种方法,用户使用起来太不方便,微软采用第二种方法,并发明了一种算法,这种算法用GUID(Globally UniqueIdentifiers)来标识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 GUIDIID; 
   //接口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其实是一个概念的两个不同的表示形式,所以我们在程序中可以随便使用任何一种。
下面是 CLSID 和 ProgID 之间的转换方法和相关的函数:

函数 功能说明 
CLSIDFromProgID()、CLSIDFromProgIDEx() 由 ProgID 得到CLSID。没什么好说的,你自己都可以写,查注册表贝 

ProgIDFromCLSID() 由 CLSID 得到 ProgID,调用者使用完成后要释放 ProgID的内存(注5) 

CoCreateGuid() 随机生成一个 GUID 

IsEqualGUID()、IsEqualCLSID()、IsEqualIID()比较2个ID是否相等 

StringFromCLSID()、StringFromGUID2()、StringFromIID() 由 CLSID,IID得到注册表中CLSID样式的字符串,注意释放内存

COM开发中的uuidGUIDCLSID,ProgID区别在哪儿.zip COM组件uuidGUIDCLSID,ProgID区别在哪儿.zip 立即下载

相关推荐

微软COMGUIDUUIDCLSIDIID

当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全球唯一:第一种是采用Internet地址一样的管理方式,成立一个管理机构,用户如果想开发一个COM组件的时候需要向该机构提出申请,并交一定的费用。第二种是发明一种算法,每次都能产生一个全球唯一的COM组件标识符。第一种方法,用户使用起来太不方便,微软采用第二种方法,并发明了一种算法,这种算法用GUID(Gl

killcpp的专栏 6931

修改activeX控件的uuid

公司里的大部分工作都是在原来的jichushang

beiguoshuo的专栏 2925

QT 调用C# COM组件uuid 方法)

本方法使用qt工具dumpcpp 为DLL生成.h/.cpp文件调用C# COM组件 1.注册DLL 运行CMD命令,执行 regsvr32 xxx.dll, 注册COM组件,若失败,尝试以管理员运行CMD。 2. 生成.h/.cpp文件,加入工程 运行CMD命令,执行 dumpcpp xxx.dll, 生成.h/.cpp 文件 把生成的文件引用到工程上,并在 .pro文件上加上 QT += axcontainer 3.获取COM组件uuid 有两种方法: 3.1 .h文件查找 在生成

linkang1024的博客 2017

微软COMGUIDUUIDCLSIDIID .

当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全球唯一: 第一种是采用Internet地址一样的管理方式,成立一个管理机构,用户如果想开发一个COM组件的时候需要向该机构提出申请,并交一定的费用。 第二种是发明一种算法,每次都能产生一个全球唯一的COM组件标识符。 第一种方法,用户使用起来太不方便,微软采用第二种方法,并发明了一种算法,这种算法用GUID(Glob

行走 477

GUIDUUIDCLSIDIID 区别及联系

本文链接:https://blog.csdn.net/zhongguoren666/article/details/6711396 当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全球唯一: 第一种是采用Internet地址一样的管理方式,成立一个管理机构,用户如果想开发一个COM组件的时候需要向该机构提出申请,并交一定的费用。 第二种是发明一种算法,每次都能产生...

予衡飞翔 1527

OPC:关于GUID以及CLSID的理解

当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全球唯一: 第一种是采用Internet地址一样的管理方式,成立一个管理机构,用户如果想开发一个COM组件的时候需要向该机构提出申请,并交一定的费用。 第二种是发明一种算法,每次都能产生一个全球唯一的COM组件标识符。 微软采用第二种方法,并发明了一种算法,这种算法用GUID(Globally Unique Identi...

dashumak的博客 4325

COM中关于使用DLL的一些知识点

我们知道:COM有一个特性,就是动态链接,而动态链接,在windows中是靠DLL来实现的。为什么可以使用DLL来实现组件呢?其原因是DLL可以共享它们所链入的应用程序的地址空间。 客户组件是通过接口进行交互的。一个接口就是一个指向函数指针的指针列表(vtbl),组件将为vtbl分配内存并用每个函数的地址来初始化此表格。为使用vtbl,客户应该能够访问组件为其vtbl分配...

weixin_30682415的博客 72

COMGUIDUUIDCLSIDIID

(今日看到网络上关于"COMGUID......"文章,写的好,故记录之.) 当初微软设计com规范的时候,有两种选择来保证用户的设计的com组件可以全球唯一: 第一种是采用Internet地址一样的管理方式,成立一个管理机构,用户如果想开发一个COM组件的时候需要向该机构提出申请,并交一定的费用。 第二种是发明一种算法,每次都能产生一个全球唯一的COM组件标识符。 第一种

joy1688的专栏 776
上一篇: 浅谈操作系统进程的引出
下一篇: 如何让UDP变得靠谱一些(增加UDP的可靠性)
kai8wei
博客等级 码龄12年 171粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值