
COM
阜哥
雄心的一半是耐心
展开
-
《COM本质论》第一章学习(1)
解决问题一:源代码级复用中,多个进程使用了同一个功能代码,就会产生多个内存副本,浪费内存资源,采用动态链接库解决这个问题。因为动态链接库只在内存中存放一个副本,多个进程共享调用。 解决问题二:C++缺少二进制级的标准。为了支持操作符重载和函数重载,而不打破现有的基于C的链接器,C++编译器篡改每一个入口点的符号名,每一种编译器的篡改方式各不相同,导致不同编译器产生的引入库不能被正确原创 2009-05-04 22:55:00 · 839 阅读 · 0 评论 -
《COM本质论》第一章学习(2)
(《COM本质论》中的例子)采用抽象类作为二进制接口。class IFastString{public: virtual int Length(void) const = 0; virtual int Find(const char *psz) const = 0;};实现类从接口继承。class FastString :public IFastString{public: FastS原创 2009-05-04 23:59:00 · 644 阅读 · 0 评论 -
《COM本质论》第二章学习(1)
定义接口时,紧跟在关键字interface后面的叫做接口的逻辑名字,在没有引入GUID的时候,这个逻辑名字就是接口的唯一标识。正如第一章中展现的,运行时询问对象(Dynamic_cast)的时候使用的就是这个逻辑名字字符串。 当两个程序员各自独立开发一个接口,在给定的共同问题域中,两个接口定义不会完全相同,方法定义的实际顺序以及每个方法的原型都有可能存在差异,然而两个程序员给接口取了相同的原创 2009-05-07 01:34:00 · 699 阅读 · 0 评论 -
《COM本质论》第二章学习(2)
COM规范的引用计数规则为三个公理:1、当一个非空接口指针从一个内存位置被拷贝到另外一个内存位置时,应该要调用AddRef,以便通知对象又有附加的引用发生。2、对于已经包含非空接口指针的内存位置来说,在重写该内存位置之前必须先调用Release,以便通知对象这个引用已经被销毁。3、如果你对两个或者多个内存位置之间的关系有特殊的理解的话,那么多余的AddRef和Release调用可以被优原创 2009-05-07 02:00:00 · 652 阅读 · 0 评论 -
《COM本质论》第一章学习(3)
环境:有一个名为ComDll.dll的动态库,导出了一个名为"CreateFastString"的函数,函数返回与IFastString所指向的vptr兼容的指针。(《COM本质论》中的例子) 实现:static IFastString * (*pfn)(const char *psz) = 0; if (!pfn) { const TCHAR szDll[] = _T("Com原创 2009-05-05 22:08:00 · 668 阅读 · 0 评论 -
《COM本质论》第一章学习(4)
class IExtensibleObject{ virtual void *Dynamic_cast(const char *pszType) = 0; virtual void DuplicatePointer(void) = 0; virtual void DestroyPointer(void) = 0;}; 基类接口抽象成这样的形式,Dynamic_cast()进行运行时类型识别原创 2009-05-05 23:51:00 · 658 阅读 · 0 评论 -
《COM本质论》第三章学习(1)
有几件事要清楚:1、COM接口的实现以DLL形式展现。2、COM组件在使用前是需要regsvr32.exe注册的。3、一个COM接口可以对应若干个实现,接口靠IID识别,实现靠CLSID识别。4、通过CoGetClassObject获得接口指针。 为什么要regsvr32.exe注册COM接口?注册COM组件,可以理解成是将实现与实现文件绑定的过程。regsvr32.e原创 2009-05-08 00:03:00 · 855 阅读 · 0 评论 -
《COM本质论》第四章学习(1)
IUnknown规则一QueryInterface满足对称性、传递性和自反性要求。 对称性:如果通过类型A的接口指针,对接口B的QueryInterface的请求能够被满足,那么在结果得到的类型为B的接口指针(指像同一个对象)上,对接口A的QueryInterface的请求将永远得到满足。即:QI(A)->B为真,则QI(QI(A)->B)->A也为真。对称性意味着客户不必关心原创 2009-05-18 14:54:00 · 656 阅读 · 0 评论