CLSID的生成
CLSID是指windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配一个唯一表示它的ID代码,用于对其身份的标示和与其他对象进行区分。
先得说下GUID,它是Globally Unique Identifier的简称,中文翻译为“全局唯一标示符”,在Windows系统中也称之为Class ID,缩写为CLSID。
CLSID像人身份证一样,是个类的唯一标识:
ID是英文IDentity的缩写,是身份标识号码的意思,就是一个序列号,也叫帐号,是一个编码,而且是唯一的。
class是对某种类型的对象定义变量和方法的原型,是ID的样式或属性的补充。
在注册表中展开HKEY_CLASSES_ROOT\CLSID\,在CLSID分支下面就可以看到很多的ID,这些ID对应的都是系统里面不同的程序,文件,系统组件等。
CLSID是一个128位的随机数,为了确保它的随机性,避免重复,它的算法主要是从两个方面入手:
1. 一部分数字来自于系统网卡的序列号,由于每一个网卡的MAC地址都不一样,因此产生的ID也就会有差异。
2. 另外一部分数字来自于系统的当前时间。
有人计算过按照上面两种方式得到ID的随机性,得出的结论是:即使一台电脑每秒产生10000000个CLSID,也可以保证3240年不会重复。
CLSID是指windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配一个唯一表示它的ID代码,用于对其身份的标示和与其他对象进行区分。
先得说下GUID,它是Globally Unique Identifier的简称,中文翻译为“全局唯一标示符”,在Windows系统中也称之为Class ID,缩写为CLSID。
CLSID像人身份证一样,是个类的唯一标识:
ID是英文IDentity的缩写,是身份标识号码的意思,就是一个序列号,也叫帐号,是一个编码,而且是唯一的。
class是对某种类型的对象定义变量和方法的原型,是ID的样式或属性的补充。
在注册表中展开HKEY_CLASSES_ROOT\CLSID\,在CLSID分支下面就可以看到很多的ID,这些ID对应的都是系统里面不同的程序,文件,系统组件等。
CLSID是一个128位的随机数,为了确保它的随机性,避免重复,它的算法主要是从两个方面入手:
1. 一部分数字来自于系统网卡的序列号,由于每一个网卡的MAC地址都不一样,因此产生的ID也就会有差异。
2. 另外一部分数字来自于系统的当前时间。
有人计算过按照上面两种方式得到ID的随机性,得出的结论是:即使一台电脑每秒产生10000000个CLSID,也可以保证3240年不会重复。
为了避免冲突,微软使用GUID作为CLSID,有生成GUID的函数,主要是根据当时的时间、机器地址等信息动态产生,理论上可保证全球唯一。
生成GUID的C++代码
//--生成GUID的代码
//--相关程序/微软guidgen.exe
#include <objbase.h>
#include <stdio.h>
//--生成GUID
constchar* newGUID()
{
staticcharbuf[64] = {0};
GUID guid;
if(S_OK == ::CoCreateGuid(&guid))
{
_snprintf(buf,sizeof(buf)
,"{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}"
, guid.Data1
, guid.Data2
, guid.Data3
, guid.Data4[0]
, guid.Data4[1]
, guid.Data4[2]
, guid.Data4[3]
, guid.Data4[4]
, guid.Data4[5]
, guid.Data4[6]
, guid.Data4[7]
);
}
return(constchar*)buf;
}
intmain(intargc,char* argv[])
{
//--COM
CoInitialize(NULL);
printf(newGUID());
printf("\r\n");
//--COM
CoUninitialize();
return0;
}