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

引子

        步入软件行业有些年头,对于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;
}

断点查看取得值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值