http://www.vckbase.com/vckbase/columnist/yangfeng/这个是杨老师写的关于COM的文章
下面是个人看的能理解的部分
最近看了一些关于COM的东西!!开始的时候不知所云,看了半天不知道在讲什么东西.....现在大致有了一些了解个人理解COM就是接口的封装只要获取了COM的GLSID地址(全球唯一的标识地址)或者获取ProgID地址既在注册表里面关于组建的注册地址那么就可以调用这个组建和组建里面的函数功能。个人理解有点像你得到了某个东西的ID那么你就可以使用这个东西!下面是自己在网上找的一个简单的实例。
COM的最初的想法是为了打败电子做电子表格软件的对手LOTUS-123,于是想如果我能在WORD程序中嵌入了EXCEL等软件,并采取自定义的结构方式,对文件进行储存,那顾客在买了WORD的时候是不是不用再卖LOTUS_123了最初是建立一个子目录,把DOC,XLS存在这同一目录中或者修改文件储存结构,在DOC结构接触扩展出包容XLS的结构但是都有缺点最后微软提出了一个非常完美的设计方案把磁盘文件的管理方案移植到了文件中-------复合文件,俗称“文件中的文件系统”
这样微软就解决了怎么保存XLS(EXCEL)数据的问题了。那么接下来就要解决另外一个问题就是当WORD程序读取复合文件的问候遇到了XLS数据的时候他怎么启动EXCEL文件呢?启动后如何让EXCEL自己去读入、解析、显示XLS数据呢?
CLSID概念有了一个非常简单的解决方案,那就是在数据对象前面,保留有处理这个数据的程序名字
----DOC文件存根目录
-----DOC数据流1
-----DOC数据流2
-----EXCEL使用的XLS子存储
------CLSID(其实就是一个号码)
------XLS数据流
CLSID的位置在注册表里的HKEY_CLASS_ROOT -->CLSID ---->LocalServer32中的默认:REG_SZ 数据:D:/PROGRA~1/MICROS~4/Office/EXCEL.EXE.
问题来了:这个在张三的计算机上EXCEL路径是:"C:/office/Excel.exe如果把这个DOC复制到李四的计算机上使用EXCEL路径是:“D:/.......................................那就不能用了!
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(远程组件)
函数 | 功能说明 |
CLSIDFromProgID()、CLSIDFromProgIDEx() | 由 ProgID 得到 CLSID。没什么好说的,你自己都可以写,查注册表贝 |