COM学习--1.COM对象标识

来源:互联网 发布:水文气象数据的重要性 编辑:程序博客网 时间:2024/05/01 17:49

引子

        步入软件行业有些年头,对于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工具
vs打开工具->创建GUID
这里写图片描述
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;}

断点查看取得值

0 0