引子
步入软件行业有些年头,对于c++的理解也算有些。本来准备从事linux驱动相关,可后来各种机缘一直辗转在windows桌面开发。用过qt、玩过mfc,虽然能够比较熟练地windows下的部分api但谈到COM一直是种痛,而且近日用到ShockwaveFlash显示而且要求显示透明背景,辗转使用多个网上的版本均不是很让我满意,用到了今下决定搞定com,遂开此贴。
COM对象标识
COM对象标识的方案选择
《COM原理与应用》一书中对CLSID的解释最为透彻,现引用上面的讲解。
1.com的标识主要用于能够让 客户寻找到COM组件,但是COM组件的位置对于客户来说是透明的,于是,客户无法通过一个地址之类的标识来索引到所需要使用的com组件;
2.对于以上问题第一种解决方案:对于COM组件定义一个唯一标识符,例:字符串;缺陷:名字冲突的可能性很大,唯一性难以保证;
3.改进,按照类似tcp/ip对COM组件表示进行分配,导致需要一个组织来同意分配,这样对于开发迭代比较不合理;
4.最终方案:通过GUID进行标识(guid为128位全局唯一标识符,这是一个随机数,不需要专门机构进行分配和管理,因为GUID是一个随机数,产生相重的概率非常小,理论上一台机器美妙产生10 000 000 == 1000w个GUID则可以保证(概率意义上)3240年不重复)。
GUID结构及产生
GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,查找在vs中可以查找到其定义
typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;
那么如何生成GUID呢?
1.通过vs工具
2.通过CoCreateGuid来生产GUID
#include "stdafx.h"
#include <afxwin.h>
#include <combaseapi.h>
#include <iostream>
int main()
{
static char buf[64] = { 0 };
GUID guid;
if (S_OK == ::CoCreateGuid(&guid)) {
_snprintf_s(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]
);
}
std::cout << buf << std::endl;
return 0;
}