COM组件编程基础
基于VB的COM编程入门教程

基于VB的COM编程入门教程第一节COM简介"世上无难事,只要肯登攀",所以你要有信心成为一个COM程序员,而且你一定能。
事实上,我们每次设置文本编程控件的Text属性时,就已经在使用COM,同样在DAO 数据控件运行MoveNext方法时,甚至在使用VB控制字时,也都是在使用COM。
那么,什么是COM呢?首先,COM是一种通信的方式。
例如,就像我们的电视遥控一样。
当我们按下某个频道按钮时,电视频道立马切换;而当我们按下开关按钮时,电视立即关闭等等。
其实,我们并不关心它们是怎样工作的,我们只知道按下按钮就能产生某个动作就可以了。
程序的原理也是一样的。
当改变文本编程控件的Text属性时,我们并不知道其中的原理,也许系统内部会调用几十个API函数也说不定?但对于用户来说,则只关心文本编程控件中显示的文本就可以了。
其次,COM是一种重用代码的方式。
使用COM的最大好处是一旦建立COM的通信方式后,可以方便地在任何地方使用多次。
例如,当用户创建一个用于显示日期和时间的COM组件后,就可用于任何程序中的任何地方。
不仅VB应用程序、Excel程序可以访问,而且C++应用程序也可以访问它。
所以,COM组件的代码可重用性是最主要的。
再次,COM是基于实际对象的。
用COM创建的大多数组件是基于实际对象的,这就意味着一旦组件被创建,其使用是相当容易的。
试想一下,如果我们在计算机系统中再添加一个用户,又有哪种添加方式如Customer.Add那样简单,是添加数据处理代码包、算法,还是向应用程序添加较大的数据库DLL?很显然,COM就支持这种简单操作。
所以,COM是一种通信方式、一种代码重用方式以及基于实际对象的。
本教程的以后部分中将简单讨论COM和VB的相关内容,这包括类的创建,以及如何将类转换成一个实际对象。
虽然,这里的内容太过简单,但却是以后COM编程的基础。
第二节类的建立在本节中,我们来实践一下。
COM编程——精选推荐

COM编程⼀、COM组件基础1.程序的编写⽅式 1) ⾯向过程的结构化编程 ⾃顶向下的编程⽅式(流程图) 2) ⾯向对象的编程 以对象或以类为中⼼,更符合⼈的思维习惯,通过模拟现实情况完成软件的编写。
(类图) 3) ⾯向组件的编程 将⼀些功能直接封装成可以执⾏的⼆进制模块,类似于搭积⽊的⽅式。
更适合⼤型项⽬,功能需求频繁发⽣变更的项⽬的开发,功能的复⽤,复⽤性更⾼的。
2. 组件及组件的特点 组件就是可以执⾏的⼆进制代码,可以为系统,软件或者其他组件提供相应的功能。
特点:1. ⼆进制代码,可以执⾏2. 动态加载和卸载3. 和具体的编程语⾔⽆关3. 组件的标准 COM提供可组件编写的彼标准,任何开发的语⾔编写组件时。
都要遵循这个标准。
⼆、COM接⼝1.接⼝Win API –Win32应⽤程序编程接⼝(函数库) C语⾔接⼝就是函数、 C++语⾔,接⼝就是类的公有函数集合 DLL的接⼝就是它所输出的那些函数 COM接⼝就是⼀组纯虚函数集合,是⼀个包含⼀个函数指针数组的内存结构,每个数组元素包含的是⼀个由组件所实现的函数的地址。
2.C++接⼝的实现 1.定义纯虚函数,不能有任何成员变量和⾮纯虚函数 2.基于纯虚类,派⽣实现类 3.添加创建对象的函数,并使⽤接⼝返回创建的对象 引⼊c++接⼝之后,当功能的提供者发⽣变化时,功能的使⽤者代码不⽤修改,两者之间的耦合性降低了。
Dll接⼝的实现 功能的提供者放到动态库中和功能的使⽤者分开两个不⽤的⼯程 1.创建Win32 dll的⼯程 2.添加头⽂件XXX.h,在⽂件中添加接⼝的定义 3.在⼯程的实现⽂件中添加实现类以及创建对象的函数1. 导出创建对象的函数,通过添加def⽂件导出该函数Dll 接⼝的使⽤ 调出导出函数的步骤:1. 加载动态库,LoadLibrary获得句柄。
2. 获取导出函数的函数地址,GetProcAddress3. 调⽤导出函数,创建对象,返回接⼝。
com组件基础笔记(一)

com组件基础笔记(⼀)在很久以前,就因为项⽬的需求,接触到了组件的概念,但是由于各种原因(主要还是⾃⼰太懒...)没有系统的学习和理解组件.进⼏天项⽬空闲下来,我魔兽世界也85了..所以安⼼的把组件的知识梳理⼀遍,当然只是很基础很基础的东西,⾥⾯还参杂了⼀些⾃⼰的理解,写下来,可以让⾃⼰以后复习,也希望⾼⼿能指点,我的主要参考资料是《com技术内幕》,csdn上有下载。
什么是com组件?什么是com技术?这些有许多解释,我个⼈的理解就是控件咯,类咯,dll咯,总之就是个⿊盒⼦,我不知道它是⽤啥实现的,只要给我接⼝,知道咋⽤就⾏了——这就是我理解的组件。
那么如何实现组件呢?我们可以⽤c++的虚类来理解接⼝.每个接⼝实现了许多函数,许多接⼝便组成了组件...bulabulabula所有的com接⼝都实现了IUnknown接⼝(接⼝中的函数都必须实现,java中是这样),该接⼝有三个⽅法:QueryInterface、AddRef、Release,com接⼝的前三个函数必定是这三个,下⾯介绍这三个函数的功能QueryInterface(const IID&iid,void**ppv):客户⽤来通过此函数来查询某个组件是否⽀持某个特定的接⼝,若⽀持则返回指向此接⼝的指针,否则返回错误代码;第⼀个参数表⽰“接⼝标识符”,标⽰接⼝所需的常量,另⼀个参数存放接⼝地址的指针;返回HRESULT可⽤相应的宏判断返回值的意义;当接⼝不被⽀持的时候*ppv应该为NULL,下⾯是⼀些代码和注释...#include <iostream>#include <objbase.h>using namespace std;void trace(const char* msg) { cout << msg << endl ;}// Interfacesinterface IX : IUnknown{virtual void __stdcall Fx() = 0 ;} ;interface IY : IUnknown{virtual void __stdcall Fy() = 0 ;} ;interface IZ : IUnknown{virtual void __stdcall Fz() = 0 ;} ;// Forward references for GUIDsextern const IID IID_IX ;extern const IID IID_IY ;extern const IID IID_IZ ;//// Component//class CA : public IX,public IY{//IUnknown implementationvirtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) ;virtual ULONG __stdcall AddRef() { return 0 ;}virtual ULONG __stdcall Release() { return 0 ;}// Interface IX implementationvirtual void __stdcall Fx() { cout << "Fx" << endl ;}// Interface IY implementationvirtual void __stdcall Fy() { cout << "Fy" << endl ;}} ;HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv)/*存ä?放¤?地Ì?址¡¤的Ì?指?针?void* 可¨¦以°?包㨹容¨Y任¨?意°a类¤¨¤型¨ª*/{if (iid == IID_IUnknown){trace("QueryInterface: Return pointer to IUnknown.") ;/*static_cast < type-id > ( expression ) ? ?该?运?算?符¤?把ã?expression转Áa换?为atype-id类¤¨¤型¨ª,ê?但Ì?没?有®D运?⾏D时º¡À类¤¨¤型¨ª检¨¬查¨¦来¤¡ä保À¡ê证¡è转Áa换?的Ì?安ã2全¨?性?。
C#创建COM组件

C#创建COM组件本⽂详细阐述如何⽤C#创建COM组件,并能⽤VC6.0等调⽤。
附:本⽂适⽤任何VS系列⼯具。
在⽤C#创建COM组件时,⼀定要记住以下⼏点:1。
所要导出的类必须为公有;2。
所有属性、⽅法也必须为公有;3。
要导出的属性、⽅法必须⽤接⼝⽅式;如果没有在接⼝中声明,即使该⽅法(属性)为公有,也不能正常导出到COM。
但他们可以被别的.NET程序所使⽤;4。
所有的事件也必须⽤接⼝⽅式;现在开始正题:⼀、新建⼀个Visual C#⼯程(习惯这种叫法了,现在应该叫解决⽅案),选择类型“类库”;就叫MyCom吧。
⼆、编写导出接⼝。
为了⼤家理解⽅便,仅以⼀加法操作举例。
如下:[Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]public interface MyCom_Interface{[DispId(1)]int Add(int a, int b);}Guid为全局唯⼀标识,可以⽤VS2008的命令提⽰符中输⼊:⽤guidgen⼯具(系统⾃带)可以产⽣guid,在⼏个复选框选择最后⼀个Registry Format,点击New Guid,然后COPY就⾏了(以下如有guid的字符串,可⽤同样操作产⽣)[DispId(1)]为函数的标识。
如果有多个函数可相应的在函数前⾯加[DispId(2)], [DispId(3)]…三、创建事件接⼝。
[Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"),InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]public interface MyCom_Events{}Guid同⼆,不多说InterfaceType表⽰向COM公开的⽅式,这⾥选择为以调度的⽅式向COM公开。
四、创建具体类:[Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"),ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(MyCom_Events))]public class Class1 : MyCom_Interface{public int Add(int a, int b){return a + b;}}⾄此,代码完毕。
编写一个简单的COM组件

编写⼀个简单的COM组件参考⽹站:(1)⽤MIDL编写.idl⽂件//将以下代码保存成 IXIYIZ.idl ⽂件//在命令⾏上进⾏编译,编译命令://midl IXIYIZ.idl//⽣成 IXIYIZ.h ,dlldata.c, IXIYIZ.h, IXIYIZ_p.c//其中 IXIYIZ.h,IXIYIZ.h ⽂件是我们⽬前所需要的import "unknwn.idl";[object,uuid(7F67119B-1E09-4d4f-B472-2106CCAE3275)]interface IX: IUnknown{[local]void __stdcall Fx();};[object,uuid(A667947B-714A-4bde-B2DD-C090928D62FF)]interface IY: IUnknown{[local]void __stdcall Fy();};[object,uuid(AA80F229-0809-4c69-B8AA-BB6F58DBC304)]interface IZ: IUnknown{[local]void __stdcall Fz();};(2)编写组件类的头⽂件// 将以下代码保存成 CA.h// 注意将(1)中⽣成的 IXIYIZ.h 头⽂件包含进来#include<iostream>#include"IXIYIZ.h"using namespace std;class CA : public IX, public IY{HRESULT __stdcall QueryInterface(const IID& iid, void ** ppv); ULONG __stdcall AddRef(){return 0;}ULONG __stdcall Release(){return 0;}void __stdcall Fx(){cout<<"Fx"<<endl;}void __stdcall Fy(){cout<<"Fy"<<endl;}};extern "C" __declspec(dllexport) IUnknown* __cdecl CreateInstance();(3)编写组件类的实现⽂件//将以下代码保存成 CA.cpp//3.1编译 IXIYIZ_i.c,编译命令://cl /c IXIYIZ_i.c ⽣成 IXIYIZ_i.obj ⽂件//3.2编译 CA.h ⽂件,编译命令://cl /c /GX CA.cpp ⽣成 CA.obj ⽂件//3.3链接上⾯两个⽂件,⽣成组件DLL,编译命令://link /dll CA.obj IXIYIZ_i.obj ⽣成 CA.lib 和 CA.dll//3.4将 IXIYIZ_i.obj 整合到 CA.lib ⽂件中,命令:// lib CA.lib IXIYIZ_i.obj#include"CA.h"HRESULT __stdcall CA::QueryInterface(const IID& iid, void ** ppv){if(iid == IID_IUnknown){cout<<"QueryInterface:Return pointer to IUnknown."<<endl;*ppv = static_cast<IX *>(this);}else if(iid == IID_IX){cout<<"QueryInterface:Return pointer to IX."<<endl;*ppv = static_cast<IX *>(this);}else if(iid == IID_IY){cout<<"QueryInterface:Return pointer to IY."<<endl;*ppv = static_cast<IY *>(this);}else{cout<<"QueryInterface:Interface not supported."<<endl;*ppv = NULL;return E_NOINTERFACE;}reinterpret_cast<IUnknown*>(*ppv)->AddRef();return S_OK;}extern "C" __declspec(dllexport) IUnknown* __cdecl CreateInstance() {IUnknown *pI = static_cast<IX*>(new CA);pI->AddRef();return pI;}(4) 编写客户端,对(3)⽣成的组件(CA.dll)进⾏测试。
COM培训教程

COM培训教程COM(Component Object Model)是一种用于组件间通信的架构,它可以实现不同应用程序组件的互操作。
COM培训教程旨在向初学者介绍COM的基本概念和使用方法,以帮助他们快速入门并开始开发自己的COM组件。
第一部分:COM概述(约200字)COM是一种面向对象的技术,它允许开发人员将代码模块化并以可重用的方式进行组合。
COM组件可以是任意编程语言编写的,只要它们符合COM的规范,就可以在不同的应用程序中进行调用和使用。
COM的核心概念是接口(Interface)。
接口定义了COM组件提供给其他组件调用的方法和属性。
通过接口,组件之间可以进行交互和通信。
COM组件还具有生命周期管理和对象实例化等基本特性。
第二部分:COM开发环境搭建(约300字)在开始COM开发之前,我们需要安装COM开发所需的工具和环境。
通常,COM开发需要使用Microsoft Visual Studio作为开发集成环境(IDE)。
Visual Studio提供了编译、调试和托管COM组件的功能。
除了IDE,我们还需要安装COM SDK(Software Development Kit),它包含了一些用于COM开发的工具和库。
COM SDK提供了COM组件的编译器、链接器和注册器等工具。
第三部分:COM组件编写(约400字)在这一部分,我们将学习如何编写一个简单的COM组件。
首先,我们需要定义COM组件的接口,接口定义了组件对外提供的方法和属性。
然后,我们需要实现接口,编写组件的具体功能代码。
接着,我们需要注册COM组件,使其可以在其他应用程序中被调用。
注册COM组件需要使用COM注册表,它是一个记录已注册组件信息的数据库。
我们可以使用COM SDK提供的注册器工具来执行注册操作。
最后,我们需要编译和部署COM组件。
编译COM组件需要使用COM编译器,它会将源代码转化为二进制文件。
部署COM组件需要将编译后的二进制文件复制到目标应用程序的目录,并在应用程序中进行配置。
C++COM编程-COM编程入门实践

C++COM编程-COM编程⼊门实践1. COM编程基础COM是⼀种规范,⽽不是实现。
当使⽤C++来实现时,COM组件就是⼀个C++类,⽽COM接⼝就是继承⾄IUnknown的纯虚类,COM组件就是实现相应COM接⼝的C++类。
COM规范规定,任何组件或接⼝都必须从IUnknown接⼝中继承⽽来。
IUnknown定义了3个重要函数,分别是QueryInterface、AddRef和Release。
其中,QueryInterface负责组件对象上的接⼝查询,AddRef⽤于增加引⽤计数,Release⽤于减少引⽤计数。
引⽤计数是COM中的⼀个⾮常重要的概念,它很好地解决了组件对象地⽣命周期问题,即COM组件何时被销毁,以及谁来销毁地问题。
除了IUnknown接⼝外,还有另外⼀个重要地接⼝,即IClassFactory。
COM组件实际上是⼀个C++类,对于组件地外部使⽤者来说,这个类名⼀般不可知,那么如何创建这个类地的例?由谁来创建?COM规范规定,每个组件都必须实现⼀个与之对应的类⼯⼚(Class Factory)。
类⼯⼚也是⼀个COM组件,它实现了IClassFactory接⼝。
在IClassFactory的接⼝函数CreateInstance中,才能使⽤new操作⽣成⼀个COM组件类对象实例。
COM组件有3种类型:①进程内组件(CLSCTX_INPROC_SERVER)②本地进程组件(CLSCTX_LOCAL_SERVER)③远程组件(CLSCTX_REMOTE_SERVER)在接⼝成员函数中,字符串变量必须⽤Unicode字符指针,这是COM规范的要求。
2. COM组件开发实现⼀个COM组件,需要完成以下⼯作:COM组件接⼝COM组件实现类COM组件创建⼯⼚COM组件注册与取消注册本⽂以⼀个例⼦作为说明,COM组件提供了⼀个SayHello的接⼝函数,将“Hello COM”打印输出。
2.1 创建COM组件接⼝COM组件接⼝是⼀个继承IUnknown的抽象类:1// IComTest.h2#pragma once3 #include <Unknwn.h>4// interface id,COM组件接⼝唯⼀标识5static const WCHAR* IID_IComTestStr = L"{213D1B15-9BBA-414A-BAB6-CA5B6CEF0006}";6static const GUID IID_IComTest = { 0x213D1B15, 0x9BBA, 0x414A, { 0xBA, 0xB6, 0xCA, 0x5B, 0x6C, 0xEF, 0x00, 0x06 } }; 7class IComTest :public IUnknown8 {9public:10virtual int _stdcall SayHello() = 0;11 };2.2 创建COM组件实现类COM组件类是⼀个实现了相应COM组件接⼝的C++类,注意:⼀个COM组件可以同时实现多个COM接⼝。
COM组件对象模型基础

COM组件对象模型基础COM组件对象模型COM组件对象模型是为了创建⼀种独⽴于任何编程语⾔的对象。
COM对象提供统⼀的接⼝,在不同的编程环境中通过调⽤COM对象特定接⼝的⽅法来完成特定的任务。
⼀般有三种⽅式编写COM组件:COM SDK,MFC,ATLCOM组件分类⼀个DLL(进程内组件)。
⽅法与客户进程在同⼀地址空间下,可直接访问到。
⼀个本地运⾏的EXE(进程外组件,本地服务器)。
⽅法与客户进程在同⼀机器的不同地址空间中,通过LPC(本地过程调⽤)访问。
⼀个远程机器上运⾏的EXE(进程外组件,远程服务器)。
⽅法与客户进程在不同机器上,通过RPC(远程过程调⽤)。
COM对象和接⼝⼀个COM组件可以含有多个COM对象,⼀个COM对象可以含有多个接⼝,⼀个接⼝可以含有多个⽅法。
为了在COM组件中唯⼀标识⼀个COM对象类,每⼀个COM对象类都有⼀个特定的标识符(CLSID),这个标识符是⼀个128位的数值。
同样对于不同的接⼝⽽⾔也有⼀个标识符(IID),也是⼀个128位的数值。
IUnknown接⼝//IUnknown接⼝的⽅法QueryInterface //返回指向另⼀个接⼝的指针AddRef //增加对象的引⽤计数Release //减少对象的引⽤计数每⼀个COM对象应该了IUnknown接⼝,⽽且为了通过对象任意⼀个接⼝指针都能调⽤其他接⼝,需要所有的接⼝处理实现⾃⼰的特定的⽅法外,还都要实现以上三种⽅法(每⼀个接⼝都继承IUnknown接⼝)。
HRESULT QueryInterface(){return (指定接⼝类*)this;}如果使⽤MFC实现COM,因为其采⽤多继承,⽽接⼝类的⽅法都是写成虚函数,COM对象类继承众多接⼝类会含有多个虚表(vtable),所以QueryInterFace返回的对应接⼝类的指针时需要强制类型转换(将this指针偏移到指定接⼝类的vtable处),这样就不会出错误调⽤到其他接⼝的⽅法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<Program> . <Component> . <Version> IDL:接口定义语言(Interface Definition Language) DCOM:分布式组建对象模型(Distributed Component Object Model )
二、COM服务器、 COM对象、COM接口和函数的关系 1. 一个COM服务器(DLL或EXE)可以包含若干个 COM对象; 2. 一个COM对象可以包含若干个接口; 3. 一个接口可以包含若干个函数。
COM服务器 COM对象1 接口1 函数1 函数2
接口2 函数1
COM对象2 接口1 函数1
函数2 函数3
说明: 1. COM不是一类程序的扩展名,也不是一种程序设计
语言;
2. COM可利用DLL来给组件提供动态链接的能力,但 COM不是DLL;
3. COM可采用各种语言进行编写(语言无关性),同一 个软件中不同组件可以使用不同的语言和工具开发;
4. COM是由OLE(对象连接与嵌入)技术发展而来, COM技术的目的是为开发、维护应用程序提供高效灵 活手段
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( ……
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( ……
virtual HRESULT STDMETHODCALLTYPE Invoke( /* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, /* [in] */ LCID lcid, /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS *pDispParams, /* [out] */ VARIANT *pVarResult, /* [out] */ EXCEPINFO *pExcepInfo, /* [out] */ UINT *puArgErr) = 0;
§10. 1 COM简介
一、什么是COM COM (Component Object Model): 组件对象模型 其中: 1. 它定义了一套为构建一个组件所必需遵循的规则。或
者说它是一个说明如何建立可动态交替更新组件的规 范,该规范为客户和组件提供保证能够互操作应该遵 循的标准; 2. 它定义了组件和它们的客户之间互相作用的方式。采 用客户进程直接调用组件中的方法,使得组件和客户 端无需任何中介组件就能互相联系; 3. COM组件有可执行代码组成,即以二进制代码形 式重用,一般通过DLL/EXE形式发布,且通过GUID 来保证每个COM对象是全球唯一的。
口指针访问对象的函数。 COM接口由一个全 局唯一标识符
(GUID)IID来区分和确定。
2. 所有COM接口都从IUnknown接口派生 struct IUnknown { virtual LONG QueryInterface( REFIID riid, void **ppv) = 0; virtual ULONG AddRef( void) = 0; virtual ULONG Release( void) = 0; }
§10. 2 基于ATL之DLL实现COM
一、ATL简介 ATL:活动模版库(Active Template Liabrary),它是为明确创建
COM对象这个目的而提供的模版类库,它提供了对几个接 口的内在支持,包括IUnknown、IClassFactory、 IDispatch 其中:IClassFactory(类工厂)是为访问一个COM服务器(DLL 或EXE)中包含多个COM对象中的接口对象提供的接口 类。 IClassFactory声明如下:
•无论何时客户完成使用接口指针时,必须调用Release :N- -
其目的是管理被使用的COM何时能够被释放:当N=0时
名词解释
UUID/GUID: Universally/Globals Unique IDentifiers 通用/全局(球)唯一标识符(128位,16字节 , 32个字符)
GUID 的格式为: “xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”
其中每个 x 是 0-9 或 A-F范围内的一个十六进制的数字。 例如: 97AD6FA3-8CAD-4068-90AE-320545A1E8C8
即为有效的 GUID 值。 CLSID: COM类标识符(CLASS Identifiers) LIBID:类型库标识符(type LIBrary Identifier) IID:接口标识符(Interface Identifiers) ProgID:Programmer IDentifiers
IClassFactory : public IUnknown {
public: virtual HRESULT STDMETHODCALLTYPE CreateInstance( IUnknown *pUnkOuter, REFIID riid, void **ppvObject) = 0; virtual HRESULT STDMETHODCALLTYPE LockServer( BOOL fLock) = 0;
说明:一般将COM对象表示为带固定格式的圆形接头, 每个接头表示一个对外提供的接口, IUnknown接 口处首要地位.
IUnknown
IInterface_1
COM服务器 接口对象1
函数1 函数2
IInterface_2
接口对象2 函数1
三、接口
1. COM接口提供访问对象的一种方式,应用程序只能通过一个接
其中: ⑴ QueryInterface通过接口标识符riid查询(确定)接口,返回
指向接口的指针的指针,同时调用AddRef(); ⑵ AddRef和Release用来管理对象接口被访问的参数计数。调用这
两种方法的规则为:设N为接口被访问的计数器。
•无论何时客户接收到接口指针时,必须调用AddRef:N++
ห้องสมุดไป่ตู้};
说明:IClassFactory 派生于IUnknown,因此它仍然支持标准的 QueryInterface的COM接口。
IDispatch(双重接口)是为和其他语言兼容提供的接口类 。 IDispatch声明如下:
IDispatch : public IUnknown { public:
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( ……