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

    COM学习笔记_外语学习-法语学习.pdf

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

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

    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)学习必备 欢迎下载 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 用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 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 Requirements Theonly 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 用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 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 plaincopy 1.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 plaincopy 1.CoGetClassObject(.)2.3./通过查注册表 CLSID_Object,得知组件 DLL的位置、文件名 4./装入 DLL库 5./使用函数 GetProcAddress(.)得到 DLL库中函数 DllGetClassObject的函数指针。6./调用 DllGetClassObject 7.8./DllGetClassObject是干什么的,它是用来获得类厂对象的。只有先得到类厂才能去创建组件.用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 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 组件的最小框架结构,然后看一看其内部处理流程是怎样的 用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 cpp view plaincopy 1.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 plaincopy 1.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 plaincopy 1.CoGetClassObject(.)2.3./通过查注册表 CLSID_Object,得知组件 DLL的位置、文件名 4./装入 DLL库 5./使用函数 GetProcAddress(.)得到 DLL库中函数DllGetClassObject的函数指针。6./调用 DllGetClassObject 7.8.DllGetClassObject是干什么的,它是用来获得类厂对象的。只有先得到类厂才能去创建组件.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.这段话的意思就是先得到类厂对象,再通过类厂创建组件从而得到 IUnknown 指针。继续深入一步,看看 CoGetClassObject的内部伪码:上图是从 COM+技术内幕中 COPY 来的一个例图,从图中可以清楚的看到CoCreateInstance的整个流程。(7)一个典型的自注册的 COM DLL 所必有的四个函数 DllGetClassObject:用于获得类厂指针 DllRegisterServer:注册一些必要的信息到注册表中 用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 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 plaincopy 1.interface IUnkown 2.3.4.5.virtual HRESULT _stdcall QueryInterface(const IID&iid,void*ppv)=0;6.7.virtual ULONG _stdcall AddRef()=0;8.9.virtual ULONG _stdcall Release()=0;10.11.;用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 2.获取 IUnkown 指针 有一个叫 CreateInstance的函数,它可以建立一个组件并返回一个 IUkown 指针:IUnkown*CreateInstance();在此,客户不必再使用 new 操作符。3.QueryInterface函数 客户可使用IUnkown中的成员函数QueryInterface查询组件是否支持某个特定的接口,如果支持,将返回一个指向此接口的指针;如果不支持,则返回一个错误代码。HRESULT _stdcall QueryInterface(const IID&iid,void*ppv);其中,第一个参数 iid 标志客户所需的接口,第二个参数 ppv 存放所请求接口的指针地址。4.使用 QueryInterface cpp view plaincopy 1.IUnkown*pI;2./define a pointer for the interface 3.IX*pIX=NULL;4./ask for interface IX 5.HRESULT hr=pI-QueryInterface(IID.IX,(void*)&pIX);6./check return value 7.if(SUCCEEDED(hr)8.9./use interface 10.pIX-fx();11.用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 在这段代码中,我们查询了 pI 是否支持由 IID.IX 所标识的接口。若成功返回,那么我们就可以使用它返回的指针了。5.QueryInterface的实现 QueryInterface需要根据某个给定的 IID 返回指向相应接口的指针。如果组件支持客户指定的接口,那么返回 S_OK及相应的指针,否则,返回 E_NOINTERFACE并将相应的指针返回值设为 NULL。例如我们有类 CA,及其接口的继承关系:cpp view plaincopy 1.HRESULT _stdcall CA:QueryInterface(const IID&iid,void*ppv)2.3.if(iid=IID.IUnkown)4.5.6./the client wants the IUnkown interface 7.*ppv=static_cast(this);8.9.else if(iid=IDD.IX)10.11./the client wants the IX interface 12.*ppv=static_cast(this);13.14.else if (iid=IDD.IY)15.16./the client wants the IY interface 17.*ppv=static_cast(this);18.19.else 用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 20.21./we dont support the interface the client wants.22./be sure to set the resulting pointer to NULL 23.*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 的方法:用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 前言:尽管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,用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载 /*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,用流水线主要体现供应链的物理功能即以最低的成本将原材料转化成零部件半成品产品以及在供应链中的运输等有效性供应链反应性供应链稳定供应链动态供应链许多企业已经普遍将信息系统业务在规定的服务水平基础上外包给应用服务外包是在竞争合作动态的市场环境中由若干个供方需方等实体自主半自主构成的快速响应环境变化的动态供需网络敏捷供应链稳定供应链反应性供应链平衡供应链提供功能性产品的公司的一个极重要的目标是提高边际利润降作关系最终集成为传统关系物流关系合作伙伴关系网络资源关系传统的生产计划决策模式是一种集中式决策而供应链管理环境下生产计划的决策模式是决策过程分布式分布式群体集中群体分权式是需求变化独立于人们的主观控制能学习必备 欢迎下载/*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 NewEn

    注意事项

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

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




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

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

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

    收起
    展开