自己关于一个基础ATL/COM的总结(1)

本文介绍了COM(Component Object Model)的基本原理,强调了它是接口的封装,通过全局唯一标识GLSID进行组件调用。文章以微软如何在WORD中嵌入EXCEL为例,探讨了COM如何实现组件位置透明性,并解释了CLSID在文件系统中的作用。同时,文中还讲解了COM组件的分布式环境考虑,HRESULT的结构,以及在创建ATL/COM组件时的步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。没什么好说的,你自己都可以写,查注册表贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值