COMM CSID和GUID
Office的Word中可以插入EXCEL数据,我们知道是通过Word存储的复合文件功能来实现的。那么当WORD程序读取复合文件,遇到EXCEL数据时,它该如何启动Excel呢?启动后,又如何让Excel自己去读入、解析、显示xls数据呢?
CLSID概念
有一个非常简单的解决方案,那就是在对象数据的前面,保存有处理这个数据的程序名。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer]
@="C:\\PROGRA~1\\MICROS~1\\Office15\\EXCEL.EXE /automation"
"LocalServer"=zqP^V5!!!!4!!!!MKKSkEXCELFiles>Of1RD?I9b9j[2hL]KhO& /automation
这的确是一个简单方法,但问题也很严重。在“张三”的计算机上,Excel路径是:”c:\office\Excel.exe”,如果把这个doc文件复制到“李四”计算机上使用,而“李四”的Excel路径是:”d:\Program files\Microsoft Office\Office\Excel.exe”
于是,微软想出了一个解决方案,不使用直接路径表示,而使用CLSID间接描述这些对象数据的处理程序路径。CLSID其实就是一个16字节的数。在HKCR\CLSID{……}主键下,在LocalServer32(DLL组件使用InprocServer32)中保存程序路径名。
CLSID结构定义:
typedef struct {
DWORD Data1; //随机数
WORD Data2; //和时间相关
WORD Data3; //和时间相关
BYTE Data4[8]; //和网卡MAC相关
} GUID;
typedef GUID CLSID; //组件ID
typedef GUID IID; //接口ID
#define REFCLSID const CLSID &
常见的声明和赋值方法
CLSID CLSID_Excel = {0x00024500,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
struct __declspec(uuid("00024500-0000-0000-C000-000000000046"))CLSID_Excel;
class DECLSPEC_UUID("00024500-0000-0000-C000-000000000046")CLSID_Excel;
注册表中的表示方法
{00024500-0000-0000-C000-000000000046}
用一个值间接表示程序名,实现了组件位置的透明,并方便地扩展出DCOM(远程组件)。
但CLSID是一个16个字节共128位的二进制数,干吗这么长?想当初,设计socket用TCP/IP协议进行网络通讯。每个参与通讯的计算机都有一个4字节的IP表示编号地址,范围是0,0,0,0~255,255,255,255共42亿个地址。
没想到,自从Internet选择TCP/IP协议后,42亿个地址不够啦。前车之鉴,微软设计CLSID/IID时,使用了16字节的GUID表示。这下好啦,全世界60亿人口,每个人每秒钟分配10亿个号码,需要分配1800亿年。
CSID其实用的是GUID的概念
生成CLSID
1.使用开发环境编写组件程序,IDE会自动产生CLSID;
2.程序中可用函数CoCreateGuid产生CLSID;
3.使用工具程序GuidGen.exe产生GUID;