一、前言
书接上回,话说在 doc(word) 复合文件中,已经解决了保存 xls(excel) 数据的问题了。那么,接下来又要解决另一个问题:当 word 程序读取复合文件,遇到了 xls 数据的时候,它该如何启动 excel 呢?启动后,又如何让 excel 自己去读入、解析、显示 xls 数据呢?
二、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亿个地址。可是没想到啊,没想到,自从 inte.net 选择了tcp/ip 协议后,42亿个地址就不够全世界的劳动人民分配啦。除了劳动人民,还有冰箱、彩电、电饭锅、手机、手提电脑......这些都需要连网呀。在办公室通过网络开启电饭锅给我焖饭,下班回家后就能吃现成的啦,多幸福呀?!(注:在我们家老婆是领导,所以是我做饭。咳......)
四、progid 概念
每一个com组件都需要指定一个 clsid,并且不能重名。它之所以使用16个字节,就是要从概率上保证重复是“不可能”的。但是,(世界上就怕“但是”二字)微软为了使用方便,也支持另一个字符串名称方式,叫 progid(注3)。见上图注册表的progid 子键内容(注4)。由于 clsid 和 progid 其实是一个概念的两个不同的表示形式,所以我们在程序中可以随便使用任何一种。(有些人就是讨厌,说话不算数。明明 guid 的目的就是禁止重复,但居然又允许使用 progid?!progid 是一个字符串的名字,重复的可能性就太大了呀。赶明儿我也写个程序,我打算这个程序的 progid 叫“excel.application”,嘿嘿)下面介绍一下 clsid 和 progid 之间的转换方法和相关的函数:
| 函数 | 功能说明 |
| clsidfromprogid()、clsidfromprogidex() | 由 progid 得到 clsid。没什么好说的,你自己都可以写,查注册表贝 |
| progidfromclsid() | 由 clsid 得到 progid,调用者使用完成后要释放 progid 的内存(注5) |
| cocreateguid() | 随机生成一个 guid |
| isequalguid()、isequalclsid()、isequaliid() | 比较2个id是否相等 |
| stringfromclsid()、stringfromguid2()、stringfromiid() | 由 clsid,iid 得到注册表中clsid样式的字符串,注意释放内存 |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器