欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年COM学习笔记 .pdf

    • 资源ID:24118660       资源大小:633.30KB        全文页数:29页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年COM学习笔记 .pdf

    学习必备欢迎下载COM 学习笔记(一)初识COM COM-ComponentObject Model,组件对象模型。 一向以难学著称, 有人曾说过这样的话:世界上只有两个程序员真正理解COM ,他们都在微软工作。这句话虽然有点过,但基本上说出了 COM 确实有些难理解。不过,不用担心,本文并不探求多深多高的技术领域,而是带领大家浏览一下我们的COM ,就像本文的题目一样:初识COM 。首先,我们先来了解一下有关COM 的概念:COM (Component Object Model,组件对象模型)是微软公司的最高级的、包罗万象的二进制通信规范,用于软件组件间跨越多个进程、机器、硬件和操作系统 进行互操作。下面我们来看看COM 的一些特点:在 COM 中,应用程序不是通过诸如ShowWindow()的 API 函数进行操纵。程序是由对象组成的, 对象向外提供一个或多个接口。接口是一组相关的函数,函数操作他们所属的对象。不能直接访问对象中的数据,而只能通过对象的接口函数访问。学过C+ 和数据结构 的人应该对上述说法并不陌生。在 COM 中,没有指向对象的指针这种东西,有的只是指向对象接口的指针。实际上,是指向另一个指针的指针。第二个指针指向一个指针表,表中的指针指向接口成员函数。该指针表称为 VTBL 。将指针指向对象后,就可以通过调用接口中的成员函数与该对象通信。如何将指针指向第一个对象呢?可以调用一个返回指向对象指针的COM 函数如:CoCreateInstace()。COM 对象都提供一个叫IUnknown的接口,该接口包含方法AddRef() 、Release() 和QueryInterface()。每个接口都是从IUnknown接口派生出来的。 前两个方法操纵一个控制对象使用期限的内部引用计数。当对象第一次被创建时,创建者必须调用该对象的AddRef() ,将计数加1。每当其他的用户将一个指针指向该对象时,必须再次调用该对象的AddRef() 方法。当用户不再使用对象时,它调用对象的Release() 方法,将引用计数减1。当最后一个用户调用对象的Release() 方法后,计数值变为0,导致对象释放自己。下面是 AddRef() 和 Release() 方法的简单实现:ULONG IUnknown:AddRef(void) m_RefCount+; return m_RefCount; ULONG IUnknown:Release(void) m_RefCount-; if(m_RefCount=0) 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 29 页 - - - - - - - - - 学习必备欢迎下载delete this; return 0; return m_RefCount; 由于每一个对象都支持IUnknown接口,因此可以通过QueryInterface()来询问对象是否支持您感兴趣的其它接口。接口通过接口ID 来标识。HRESULT IUnknown:QueryInterface(REFIID riid,LPVOID FAR *ppv) if(riid=IID_IUnknown|riid=IID_IDropTarget) *ppv=(LPVOID)this; AddRef(); Return S_OK; else *ppv=NULL; return E_NOINTERFACE; 用于唯一地区分COM 中条目的标识符是一个被称为GUID(全局唯一标识符)或 UUID(通用唯一标识符)。Typedef struct_GUID unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data8; GUID;GUID 的取值范围非常大,16 个字节可能形成的不同组合为3.41038 。在 COM 中传输格式化数据的工作是通过数据对象处理的,数据对象是支持IDataObject接口的对象。 IDataObject接口支持以下方法:IDataObject:GetData IDataObject:GetDataHere IDataObject:QueryGetData 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 29 页 - - - - - - - - - 学习必备欢迎下载IDataObject:GetCanonicalFormatEtc IDataObject:SetData IDataObject:EnumFormatEtc IDataObject:DAdvise IDataObject:DUnadvise IDataObject:EnumDAdvise决定了设计方案以及接口中需要包括的方法和参数后,必须使用接口描述语言(IDL )编写接口的抽象定义。编写好.IDL 文件后,使用VC+ 和 PlatformSDK自带得 MicrosoftIDL编译器编译, 并生成头文件、 勇于构建调度借口调用的代理和占为程序的代码以及实现开发工具和调用接口所必需的类型库。自动化,通过它COM 对象可以将其功能提供给解释型客户(如脚本编写语言)而不是编译型客户使用。在开发阶段,当COM 接口客户被编译时,编译器读取源代码,通过查阅头文件或类型库中的接口定义将方法名称解析为VTBL 条目,并生成目标代码,以便将必须的参数压入堆栈并跳到接口VTBL 中相应条目保存的地址。编译过程可能需要很长时间,但编译后运行二进制代码的速度相对较快。而解释型客户在真正执行之前,不会将源代码解析为机器代码。 自动化对象通过一个叫做IDispatch的标准接口暴露其所有的功能,而不是将每项功能作为自定义接口的VTBL 中的条目来暴露。对对象的任何内部方法的调用都是通过该接口进行处理的。IDispatch接口的方法包括:IDispatch:Invoke IDispatch:GetIDsOfNames IDispatch:GetTypeInfo IDispatch:GetTypeInfoCount当客户想调用自动化对象的内部方法时,它调用对象的IDispatch:Invoke()。客户可使用IDispatch:GetIDsOfNames获得想要做事情的ID。类型库是对象厂商提供的静态数据结构的集合,通过ItypeLib接口进行访问,包含关于单个对象、接口或类的信息。类型库可以包含描述下述内容的信息:服务器支持的对象类型 每个对象方法及其参数和类型 每个对象属性及其类型 枚举常量值 到在线文档中特定条目的引用COM Language RequirementsTheonly language requirement for COM is that code is generated in a language thatcan create structures of pointers and, either explicitly or implicitly, callfunctions through pointers. Object-oriented languages such as C+ andSmalltalk? provide programming 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 3 页,共 29 页 - - - - - - - - - 学习必备欢迎下载mechanisms that simplify the implementation ofCOM objects, but languages such as C, Pascal, Ada, Java , and even BASICprogramming environments can create and use COM objects. 以上摘自MSDN ,重要的是C, Pascal, Ada, Java,and even BASIC都可以用来编写COM 。以上初步介绍了关于COM 的一些东西, 不多也很浅, 理解以上的部分就够花费很长一段时间的了,如果真地对COM 感兴趣的话,最好有一定的基础,包括:数据结构,面向对象的程序设计, Windows编程等,不过也不一定都学,只是这些会对你学习COM 并在短时间内掌握并深入理解COM 会有相当的好处。COM 学习笔记(二) CoCreateInstance具体内部实现cpp view plaincopy1. CoCreateInstance(.) 2. 3./. 4.IClassFactory *pClassFactory=NULL; 5.CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void *)&pClassFactory); 6.pClassFactory-CreateInstance(NULL, IID_IUnknown, (void *)&pUnk); 7.pClassFactory-Release(); 8./. 9. 这段话的意思就是先得到类厂对象,再通过类厂创建组件从而得到IUnknown指针。 继续深入一步,看看CoGetClassObject的内部伪码:cpp view plaincopy1. CoGetClassObject(.) 2. 3./ 通过查注册表CLSID_Object,得知组件DLL 的位置、文件名4./ 装入 DLL 库5./ 使用函数 GetProcAddress(.)得到 DLL 库中函数 DllGetClassObject的函数指针。6./ 调用 DllGetClassObject 7. 8./DllGetClassObject是干什么的,它是用来获得类厂对象的。只有先得到类厂才能去创建组件 . 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 4 页,共 29 页 - - - - - - - - - 学习必备欢迎下载9./下面是 DllGetClassObject的伪码:10.DllGetClassObject(.) 11. 12./. 13.CFactory* pFactory= new CFactory; / 类厂对象14.pFactory-QueryInterface(IID_IClassFactory, (void *)&pClassFactory); 15./ 查询 IClassFactory指针16.pFactory-Release(); 17./. 18. 19./CoGetClassObject的流程已经到此为止,现在返回CoCreateInstance,看看CreateInstance的伪码:20.CFactory:CreateInstance(.) 21. 22./. 23.CObject *pObject = new CObject; / 组件对象24.pObject-QueryInterface(IID_IUnknown, (void *)&pUnk); 25.pObject-Release(); 26./. 27. 这部分我们将构造一个创建COM 组件的最小框架结构,然后看一看其内部处理流程是怎样的名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 5 页,共 29 页 - - - - - - - - - 学习必备欢迎下载cpp view plaincopy1.IUnknown *pUnk=NULL; 2.IObject *pObject=NULL; 3.CoInitialize(NULL); 4.CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IUnknown, (void *)&pUnk); 5.pUnk-QueryInterface(IID_IOjbect, (void *)&pObject); 6.pUnk-Release(); 7.pObject-Func(); 8.pObject-Release(); 9.CoUninitialize(); cpp view plaincopy1.CoCreateInstance(.) 2. 3. 4.IClassFactory *pClassFactory=NULL; 5.CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void *)&pClassFactory); 6.pClassFactory-CreateInstance(NULL, IID_IUnknown, (void *)&pUnk); 7.pClassFactory-Release(); 8. 9. 这就是一个典型的创建COM 组件的框架,不过我的兴趣在CoCreateInstance身上,让我们来看看它内部做了一些什么事情。以下是它内部实现的一个伪代码: cpp view plaincopy1.CoGetClassObject(.) 2. 3./ 通过查注册表CLSID_Object,得知组件DLL 的位置、文件名4./ 装入 DLL库5./ 使用函数 GetProcAddress(.)得到 DLL 库中函数 DllGetClassObject的函数指针。6./ 调用 DllGetClassObject7. 8.DllGetClassObject是干什么的, 它是用来获得类厂对象的。只有先得到类厂才能去创建组件. 9.下面是 DllGetClassObject的伪码:10.DllGetClassObject(.) 11. 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 6 页,共 29 页 - - - - - - - - - 学习必备欢迎下载12. 13.CFactory* pFactory= new CFactory; / 类厂对象14.pFactory-QueryInterface(IID_IClassFactory, (void *)&pClassFactory); 15./ 查询 IClassFactory指针16.pFactory-Release(); 17. 18. 19.CoGetClassObject的流程已经到此为止,现在返回CoCreateInstance,看看CreateInstance的伪码:20.CFactory:CreateInstance(.) 21. 22. 23.CObject *pObject = new CObject; / 组件对象24.pObject-QueryInterface(IID_IUnknown, (void *)&pUnk); 25.pObject-Release(); 26. 27. 这段话的意思就是先得到类厂对象,再通过类厂创建组件从而得到IUnknown指针。 继续深入一步,看看CoGetClassObject的内部伪码:上图是从 COM+ 技术内幕中COPY 来的一个例图,从图中可以清楚的看到CoCreateInstance的整个流程。(7) 一个典型的自注册的COM DLL所必有的四个函数DllGetClassObject:用于获得类厂指针DllRegisterServer:注册一些必要的信息到注册表中名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 7 页,共 29 页 - - - - - - - - - 学习必备欢迎下载DllUnregisterServer:卸载注册信息DllCanUnloadNow:系统空闲时会调用这个函数,以确定是否可以卸载DLL DLL 还有一个函数是DllMain, 这个函数在COM 中并不要求一定要实现它,但是在VC生成的组件中自动都包含了它,它的作用主要是得到一个全局的实例对象。(8) 注册表在 COM 中的重要作用首先要知道GUID 的概念, COM 中所有的类、接口、类型库都用GUID 来唯一标识,GUID 是一个 128 位的字串,根据特制算法 生成的 GUID 可以保证是全世界唯一的。COM组件的创建, 查询接口都是通过注册表进行的。有了注册表, 应用程序就不需要知道组件的DLL 文件名、位置,只需要根据CLSID 查就可以了。当版本升级的时侯,只要改一下注册表信息就可以神不知鬼不觉的转到新版本的DLL 。COM 学习笔记(三) IUnknown 接口一:接口定义任何一个接口都是继承于IUnknown接口。客户同组件的交互都是通过一个接口完成的。在客户查询组件的其他接口时,也是通过接口完成的。这个接口就是Iunkown,它的定义包含在Win32 SDK 中的 UNKOWN.h 头文件中。cpp view plaincopy1.interface IUnkown 2.3. 4.5.virtualHRESULT _stdcall QueryInterface(const IID& iid, void * ppv) = 0;6.7.virtualULONG _stdcall AddRef() = 0; 8.9.virtualULONG _stdcall Release() = 0; 10.11.; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 8 页,共 29 页 - - - - - - - - - 学习必备欢迎下载2. 获取 IUnkown 指针有一个叫CreateInstance的函数,它可以建立一个组件并返回一个IUkown 指针: IUnkown* CreateInstance() ;在此,客户不必再使用new操作符。3. QueryInterface函数客户可使用IUnkown 中的成员函数QueryInterface查询组件是否支持某个特定的接口,如果支持,将返回一个指向此接口的指针;如果不支持,则返回一个错误代码。 HRESULT _stdcall QueryInterface(const IID& iid, void* ppv);其中,第一个参数iid标志客户所需的接口,第二个参数ppv 存放所请求接口的指针地址。4. 使用 QueryInterfacecpp view plaincopy1.IUnkown* pI; 2./define a pointer for the interface3.IX* pIX = NULL; 4./ask for interface IX5.HRESULT hr = pI-QueryInterface(IID.IX, (void *) &pIX); 6./check return value7.if (SUCCEEDED(hr) 8. 9./use interface10. pIX-fx(); 11. 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 9 页,共 29 页 - - - - - - - - - 学习必备欢迎下载在这段代码中,我们查询了pI 是否支持由IID.IX所标识的接口。若成功返回, 那么我们就可以使用它返回的指针了。5. QueryInterface的实现 QueryInterface需要根据某个给定的IID 返回指向相应接口的指针。如果组件支持客户指定的接口,那么返回S_OK及相应的指针,否则,返回E_NOINTERFACE 并将相应的指针返回值设为 NULL 。例如我们有类CA ,及其接口的继承关系:cpp view plaincopy1.HRESULT _stdcall CA:QueryInterface(const IID& iid, void * ppv) 2. 3.if(iid = IID.IUnkown) 4. 5.6./the client wants the IUnkown interface7. *ppv = static_cast(this); 8. 9.elseif (iid = IDD.IX) 10. 11./the client wants the IX interface12. *ppv = static_cast(this); 13. 14.elseif (iid = IDD.IY) 15. 16./the client wants the IY interface17. *ppv = static_cast(this); 18. 19.else名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 10 页,共 29 页 - - - - - - - - - 学习必备欢迎下载20. 21./we dont support the interface the client wants.22./be sure to set the resulting pointer to NULL23. *ppv = NULL; 24.return E_NOINTERFACE; 25. 26.static_cast(*ppv)-AddRef(); 27.return S_OK; 28. 在这里, QueryInterface使用一个简单的if-then-else语句实现。当然用其他任何一种可以将一种类型映射成另外一种类型的结构也是可以实现的。如可用数组、哈希表或树来实现。6. QueryInterface的实现规则(1) QueryInterface必须总是返回同一IUnkown 指针可以通过查询两个接口的IUnkown 接口,并比较其返回值来确定这两个接口是否指向同一组件。(2)若客户曾经获取过某个接口,那么它将总能获取此接口(3)客户可以再次获取已经拥有的接口(4)客户可以返回到起始接口(5)若能够从某个接口获取某特定接口,那么可以从任意接口都将可以获取此接口COM 学习笔记(四) IDispatch 接口原理与应用目录:IDispatch 接口原理与应用目录:前言:IDispatch 接口的定义:创建支持IDispatch 接口的 COM 对象:标准方式调用IDispatch 接口的方法:采用 ATL 智能指针类调用IDispatch 接口的方法:使用类 COleDispatchDriver 调用 IDispatch 的方法:名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 11 页,共 29 页 - - - - - - - - - 学习必备欢迎下载前言:尽管 com接口是跨语言的, 但是很多语言在使用com时更多地通过Automation 技术来和 com对象通信。 IDispatch 接口是 Automation 的核心技术。尽管 c+程序员并不喜欢甚至讨厌使用IDispatch 接口,因为调用它实在是非常的麻烦而且易出错。但是不可否认大量的现存组件是只基于IDispatch 接口技术而开发的,有时候你没有选择,而且如果你想要写一些组件能够在web 上运行,你也离不开IDisptch 接口,因为VBScript 这样的脚本语言不会聪明到能够理解你的基于虚函数表的普通com 接口。与其躲避它,不如征服它。本文中,我将结合自己的经验和读者一起探讨IDispatch 接口的各种应用。并介绍几种能够加快我们使用IDispatch 接口的 c+类。IDispatch接口的定义:参照文件oaidl.h 中的定义 -MIDL_INTERFACE(00020400-0000-0000-C000-000000000046) IDispatch : public IUnknown public : virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( /* out */ UINT *pctinfo) = 0; virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( /* in */ UINT iTInfo, /* in */ LCID lcid, /* out */ ITypeInfo *ppTInfo) = 0; virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( /* in */ REFIID riid, /* size_isin */ LPOLESTR *rgszNames, /* in */ UINT cNames, /* in */ LCID lcid, /* size_isout */ DISPID *rgDispId) = 0; virtual /* local */ HRESULT STDMETHODCALLTYPE Invoke( /* in */ DISPID dispIdMember, /* in */ REFIID riid, 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 12 页,共 29 页 - - - - - - - - - 学习必备欢迎下载/* in */ LCID lcid, /* in */ WORD wFlags, /* outin */ DISPPARAMS *pDispParams, /* out */ VARIANT *pVarResult, /* out */ EXCEPINFO *pExcepInfo, /* out */ UINT *puArgErr) = 0; ; 我们通过IDispatch 的 GUID 到注册表中搜索,可以搜索到如下结果:注意在 IDispatch 接口 GUID 下面还有两个展开的GUID 项, 他们分别是 ITypeInfo 和 ITypeLib接口。这两个接口在自动化应用中也是非常重要的。今后我们会经常看到他们。IDispatch 接口方法简介:1)HRESULT STDMETHODCALLTYPE GetTypeInfoCount( /* out */ UINT *pctinfo) ; 判断实现了IDispatch接口的对象是否支持类型信息,如果返回1 则支持,返回 0 则不支持。2) HRESULT STDMETHODCALLTYPE GetTypeInfo( /* in */ UINT iTInfo, /* in */ LCID lcid, /* out */ ITypeInfo *ppTInfo) = 0; 获取对象的类型信息接口指针,该方法调用之前总应该先调用方法GetTypeInfoCount()确认是否支持类型信息。参数 iTInfo 必须为 0,否则该方法将返回DISP_E_BADINDEX表示失败参数 lcid 传递类型信息的地域标志。IDispatch 接口的方法和属性在不同的语言环境(地域标志)可以使用不同的名称,因而lcid 不同可能会导致返回的ITypeInfo 接口指针不同。如果我们创建的组件根据不同的地域标志对属性和方法起不同的名字,我们就要使用这个参数,否则可以忽略。 3)HRESULT STDMETHODCALLTYPE GetIDsOfNames( /* in */ REFIID riid, /* size_isin */ LPOLESTR *rgszNames, /* in */ UINT cNames, /* in */ LCID lcid, 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 13 页,共 29 页 - - - - - - - - - 学习必备欢迎下载/* size_isout */ DISPID *rgDispId) IDispatch 接口的属性实质上是方法,方法也就是成员函数,IDispatch接口把所有成员函数的入口地址放入到一个数组中,并且内部组织了一个Map ,将数组索引和方法名称一一映射。我们常见的DISPID 就是这些方法在数组中的索引。如果我们想调用某一个方法,我们就需要 DISPID 来让我们找到该方法的地址。参数 riid 必须为 NULL 。参数 rgszNames为字符串数组, 第一个字符串为方法或者属性的名称,后续的字符串为参数名称, IDispatch 接口的参数也可以有名字。参数 cNames 指定 rgszNames数组中字符串的个数。参数 lcid 传递地域标志,同GetTypeInfo方法中的参数。参数 rgDispId输出一个数组,每个数组成员对应rgszNames中的一个字符串名称。关于 DISPID 的进一步说明:typedef LONG DISPID; typedef DISPID MEMBERID; DISPID小于等于0 的值都是有特殊意义的,如下面介绍的- /* DISPID reserved to indicate an unknown name */* only reserved for data members (properties); reused as a method dispid below */如果 GetIDsOfNames函数找不到与名称相对应的DISPID, 返回该值#define DISPID_UNKNOWN ( -1 ) /* DISPID reserved for the value property */如果调用时不指定方法或者属性,则使用该缺省值#define DISPID_VALUE ( 0 ) /* The following DISPID is reserved to indicate the param * that is the right-hand-side (or put value) of a PropertyPut */ / 表明属性设置函数中某一个参数将接受新属性值#define DISPID_PROPERTYPUT ( -3 ) /* DISPID reserved for the standard NewEnum method */名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 14 页,共 29 页 - - - - - - - - - 学习必备欢迎下载/用于集合对象#define DISPID_NEWENUM ( -4 ) /* DISPID reserved for the standard Evaluate method,脚本语言中可以用调用该方法*/#define DISPID_EVALUATE ( -5 ) /* 表示某方法具有和构造函数相同的功能*/#define DISPID_CONSTRUCTOR ( -6 ) /* 表示某方法具有和析构函数相同的功能*/#define DISPID_DESTRUCTOR ( -7 ) /* The Collect property. You use this property if the method you are calling through Invoke is an accessor function.*/#define DISPID_COLLECT ( -8 ) /* The range -500 through -999 is reserved for Controls */* The range 0 x80010000 through 0 x8001FFFF is reserved for Controls */* The range -5000 through -5499 is reserved for ActiveX Accessability */* The range -2000 through -2499 is reserved for VB5 */* The range -3900 through -3999 is reserved for Forms */* The range -5500 through -5550 is reserved for Forms */* The remainder of the negative DISPIDs are reserved for future use */4) HRESULT STDMETHODCALLTYPE Invoke( /* in */ DISPID dispIdMember, /* in */ REFIID riid, /* in */ LCID lcid, /* in */ WORD wFlags, /* outin */ DISPPARAMS *pDispParams, /* out */ VARIANT *pVarResult, /* out */ EXCEPINFO *pExcepInfo, /* out */ UINT *puArgErr) 参数 dispIdMember为方法或者属性的DISPID , 就是我们通过GetIDsOfNames获得的。参数 riid 必须为 IID_NULL 。名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 15 页,共 29 页 - - - - - - - - - 学习必备欢迎下载参数 lcid 为地域标志,同前面两个方法。参数 wFlags 有下面若干值 - ValueDescriptionDISPATCH_METHOD表示将调用方法。如果属性名称和方法名称相同,则和DISPATCH_PROPERTYGET标志一起设置。DISPATCH_PROPERTYGET获得属性DISPATCH_PROPERTYPUT设置属性DISPATCH_PROPERTYPUTREF通过引用设置属性参数 pDispParams为参数信息数组,元素类型为DISPPARAMS typedef struct tagDISPPARAMS /* size_is */ VARIANTARG *rgvarg;/参数数组/* size_is */ DISPID *rgdispidNamedArgs;/参数中的DISPID 数组 UIN

    注意事项

    本文(2022年COM学习笔记 .pdf)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开