电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

COM组件设计与应用之GUID和接口

COM组件设计与应用之GUID和接口_第1页
1/8
COM组件设计与应用之GUID和接口_第2页
2/8
COM组件设计与应用之GUID和接口_第3页
3/8
一、前言 书接上回,话说在 doc(Word) 复合文件中,已经解决了保存 x ls(Ex cel) 数据的问题了。那么,接下来又要解决另一个问题:当 WORD 程序读取复合文件,遇到了 x ls 数据的时候,它该如何启动 Ex cel 呢?启动后,又如何让 Ex cel 自己去读入、解析、显示 x ls 数据呢? 二、CLSID 概念 有一个非常简单的解决方案,那就是在对象数据的前面,保存有处理这个数据的程序名。(见下图左上) 图一、CLSID 的概念 这的确是一个简单的方法,但同时问题也很严重。在“张三”的计算机上,Ex cel 的路径是:"c:\office\Ex cel.ex e",如果把这个.doc 文件复制到“李四”的计算机上使用,而“李四”的 Ex cel 的路径是: "d:\Program files\Microsoft Office\Office\Ex cel.ex e",完蛋了 于是,微软想出了一个解决方案,那就是不使用直接的路径表示方法,而使用一个叫 CLSID(注 1)的方式间接描述这些对象数据的处理程序路径。CLSID 其实就是一个号码,或者说是一个 16 字节的数。观察注册表(上图),在 HKCR\CLSID\{......}主键下,LocalServer32(DLL 组件使用 InprocServer32) 中保存着程序路径名称。CLSID 的结构定义如下: typedef struct _GUID { 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} 用一个号码间接表示程序名,的确是个 Good idea,实现了组件位置的透明性,并方便地扩展出 DCOM(远程组件)。但,但,但,但.....CLSID 有 16 个字节共 128 位二进制数,干吗用这么长的数字呀?遥想当年......我还在上幼儿园的时候,人们设计了 socket,用 TCP/IP 协议进行网络通讯。每个参与通讯的计算机都有一个 4 字节的 IP 表示编号地址,范围是 0,0,0,0 ~ 255,255,255,255 共 42 ...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

COM组件设计与应用之GUID和接口

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部