com 关于CLSID
2014-07-16 19:57
197 查看
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年不会重复。
为了避免冲突,微软使用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;
}
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;
}
相关文章推荐
- 关于Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070005的解决办法
- 关于www.eygle.com最近的一系列调整
- 关于在COM中使用可选参数的研究
- 关于VC向导生成的COM的注册与反注册
- 关于msn.com的Email
- 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
- 关于重用:类,DLL,COM
- 关于VC向导生成的COM的注册与反注册
- 请教:关于C#调用COM的问题
- BCB中关于CLSID_XXXX找不到的问题
- 关于COM中智能指针的一些建议.
- 关于CashFiesta.com
- 关于多次刷新网页(该网页调用COM)出现在COM中的错误
- 关于cankao.com数据更新的说明
- 关于com的理解
- 关于COM中的复合文档
- 关于多次刷新网页(该网页调用COM)出现在COM中的错误
- 一个关于数据连接语法的网站http://www.connectionstrings.com/
- 关于通过COM自动化调用Excel的效率问题
- 关于通过COM自动化调用Excel的效率问题