随笔分类 -  COM

COM Hook原理
摘要:掌握C++对象模型底层知识的人都知道,C++利用虚函数的机制来实现运行期的多态。例如一个类申明如下:classA{public:A(){}~A(){}virtualvoidf1(){printf("Founctionf1called\n");}virtualvoidf2(){printf("Founctionf2called\n");}virtualvoidf3(){printf("Founctionf3called\n");}private:intn;};那么A对象在内存中的结构图大概如下: (缺失)如上图:可以看到A对象的前4个字 阅读全文
posted @ 2011-06-17 10:02 maxweii 阅读(2405) 评论(0) 推荐(0)
ATL学习笔记(4): COM接口映射表
摘要:CComObjectRootObjectBase中以表驱动的方式对接口的查询作了一个内部的实现,即InternalQueryInterface()。所以在创建基于ATL的COM类时,需要创建一个包含所有实现接口的映射表。1. BEGIN_COM_MAP、END_COM_MAP、COM_INTERFACE_ENTRY与COM_INTERFACE_ENTRY2宏ATL提供了BEGIN_COM_MAP、END_COM_MAP、COM_INTERFACE_ENTRYCOM_INTERFACE_ENTRY2这4个宏来创建接口映射表。假设一个类CClassA继承了接口IIntA和IIntB,则该类的接口映 阅读全文
posted @ 2011-06-01 14:00 maxweii 阅读(848) 评论(0) 推荐(0)
静态库Lib和动态库Dll
摘要:1.概论1.什么是静态连接库,什么是动态链接库 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。静态链接库与静态链接库调用规则总体比较如下。 对于静态链接库(比较简单):首先,静态链接库的使用需要库的开发者提供生成库 阅读全文
posted @ 2011-03-29 00:49 maxweii 阅读(1382) 评论(0) 推荐(0)
智能指针CComPtr 和 CComQIPtr
摘要:1 简介:ATL 提供了2个智能指针的模板包装类,CComPtr<> 和 CComQIPtr<>,这两个类都在 <atlbase.h> 中声明。CComQIPtr<> 包含了 CComPtr<>的所有功能,因此我们可以完全用 CComQIPtr<> 来使用智能接口指针,唯一要说明的一点就是:CComQIPtr<> 由于使用了运算符的重载功能,它会自动帮我们调用QueryInterface()函数,因此 CComQIPtr<> 唯一的缺点就是不能定义 IUnknown * 指针。 // 智能指针 sm 阅读全文
posted @ 2011-03-22 09:27 maxweii 阅读(570) 评论(0) 推荐(0)
IDL详解
摘要:Question:什么是IDL和MIDL?Answer:IDL是接口定义语言。MIDL是Microsoft的IDL编译器。在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理和存根DLL的C代码。一个例子:import “unknown.idl” ///用于将其他IDL文件中的定义包含到当前文件中///Interface IX[ ///注意是[ ]不是 {}object, ///所定义的接口是一个COM接口uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682), ///相应的接口IIDhelpstring(“IX Interface”), / 阅读全文
posted @ 2011-03-21 00:33 maxweii 阅读(31274) 评论(0) 推荐(0)
COM三大接口:IUnknown、IClassFactory、IDispatch。
摘要:COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。 COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是 QueryInterface、AddRef、Release。这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。QueryInterface用于查询组件实现的其它接口,说白了也就是看看这个组件的父类中还有哪些接口类,AddRef用于增加引用计数,Release用于减少引用计数。引用计数也是COM中的一个非常重要的概念。大体上简单的说来可以这么理解,COM组件是个DLL,当客户程序要用它 阅读全文
posted @ 2011-03-18 13:54 maxweii 阅读(7325) 评论(3) 推荐(3)
C++垃圾回收器的实现(附auto_ptr 与CComPtr区别)
摘要:一、简介这是一个自己写C++垃圾自动回收器,用到的都是标准C++语法。采用了引用计数加mark-sweep的方法。在没有循环引用的情况下,引用计数可以保证垃圾实时得到回收;对于有循环引用的情况下,计数就不能回收了,这时就要用mark-sweep的方法。其实完全使用mark- sweep的方法也是可以的,但有了引用计数,可以回收大量的非循环引用垃圾,减少最后的mark-sweep时的工作量。考虑到大家的15分钟阅读热情,在说细节之前,先show一下这个指针怎么使用。顺便提一下,这个指针可以在Windows+MSVC和Linux+GCC下编译,使用。代码下载在http://download.csd 阅读全文
posted @ 2011-03-16 14:57 maxweii 阅读(800) 评论(0) 推荐(0)
CComPtr用法
摘要:COM接口指针很危险,因为使用过程中需要每一个使用者都要严格并且正确的AddRef和Release,一旦出现问题,就会造成对象不能被正常释放,或者对象被重复删除,造成程序崩溃。所以使用COM接口,必须小心翼翼才行。但是,即使所有的代码中,都正确的AddRef和Release,也不一定能保证万无一失,例如:void SomeApp( IHello * pHello ){IHello* pCopy = pHello;pCopy->AddRef(); OtherApp();pCopy->Hello();pCopy->Release();}看起来好像无懈可击,但是假设OtherApp 阅读全文
posted @ 2011-03-16 14:06 maxweii 阅读(397) 评论(0) 推荐(0)
COM :IUnknown接口QueryInterface函数介绍
摘要:一、COM组件的目标:COM组件的一个主要优势是:便于升级。要实现这个优势需要满足一下两个条件:1、运行时从客户程序动态加载和卸载,采用DLL技术可以实现。2、为了更好的突出DLL的优势,还需要信息隐藏,即封装性。二、COM组件的信息隐藏采用IUnknown接口来实现: 1、IUnknown接口功能简介:IUnknown意思是未知,即未知的接口。采用这个名字是为了简单起见,所有的COM接口都需要继承IUnknown,因此若某个客户拥有一个IUnknown接口的指针,也就不知道接口到底是什么类型的,只需要知道此接口可以用来查询其他接口。IUnknown接口有一个用来查询接口的函数QueryInt 阅读全文
posted @ 2009-11-12 09:33 maxweii 阅读(1336) 评论(0) 推荐(0)