com接口

vc中调用Com组件的方法详解

不羁岁月 提交于 2020-03-02 06:37:01
Requirement: 1.创建myCom.dll,该COM只有一个组件,两个接口IGetRes--方法Hello(),IGetResEx--方法HelloEx(); 2.在工程中导入组件或类型库 #import " 组件所在目录myCom.dll " no_namespace 或 #import " 类型库所在目录myCom.tlb " using namespace MYCOM; 方式1 CoInitialize(NULL); CLSID clsid; CLSIDFromProgID(OLESTR( " myCom.GetRes " ), // & clsid); // CComPtr < IGetRes > pGetRes; // 智能指针 pGetRes.CoCreateInstance(clsid); pGetRes -> Hello(); pGetRes.Release(); // 小心哦,请看最后的“注意” CoUninitialize(); 方式2 CoInitialize(NULL); CLSID clsid; HRESULT hr = CLSIDFromProgID(OLESTR( " myCom.GetRes " ), & clsid); IGetRes * ptr = NULL; hr = CoCreateInstance(clsid, NULL,

vc 中调用COM组件的方法

喜欢而已 提交于 2020-03-02 06:33:08
需求: 1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库 #import " 组件所在目录myCom.dll " no_namespace 或 #import " 类型库所在目录myCom.tlb " using namespace MYCOM; 方法一: CoInitialize(NULL); CLSID clsid; CLSIDFromProgID(OLESTR( " myCom.GetRes " ), & clsid); CComPtr < IGetRes > pGetRes; // 智能指针 pGetRes.CoCreateInstance(clsid); pGetRes -> Hello(); pGetRes.Release(); // 小心哦!!请看最后的“注意” CoUninitialize(); 方法二: CoInitialize(NULL); CLSID clsid; HRESULT hr = CLSIDFromProgID(OLESTR( " myCom.GetRes " ), & clsid); IGetRes * ptr; hr = CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,

vc中调用Com组件的方法详解

一笑奈何 提交于 2020-03-02 06:32:34
-------------------------------------------------------------------------------- Requirement: 1.创建myCom.dll,该COM只有一个组件,两个接口IGetRes--方法Hello(), IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库 #import "组件所在目录myCom.dll" no_namespace 或 #import "类型库所在目录myCom.tlb" using namespace MYCOM; --Method 1------------------------------------------------------- CoInitialize(NULL); CLSID clsid; CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid); CComPtr<IGetRes> pGetRes;//智能指针 pGetRes.CoCreateInstance(clsid); pGetRes->Hello(); pGetRes.Release();//小心哦!!请看最后的“注意” CoUninitialize(); --Method 2-----------------------------------

怎么通俗的解释COM组件?

北城余情 提交于 2020-01-26 04:09:21
作者:知乎用户 链接:https://www.zhihu.com/question/49433640/answer/116028598 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 GUID:全局唯一标识符,可以看成是唯一的一个ID,类似于物理网址那样。IID:也就是接口的唯一ID。C++中本没有接口的概念,是COM强行引入的,也就是一个类中全部都是纯虚函数,这样的类称为接口(interface),微软甚至定义了一个宏,大概就是这样:#define interface struct;IUnknown接口:这个解释起来会比较麻烦。如 @灵剑 所说,当自己写的一个dll升级的时候,内部可能增加了成员,导致分配的空间发生变化,从而使得次dll和以前的dll不能兼容。这个就是臭名昭著的dll hell,为此微软最开始想了个很挫的方法,那就是在dll后面加上自己的版本号,如:myDll_1.dll, myDll_2.dll……如果你打开system32目录看看就知道是怎么回事了。但是这样总不是一个办法,假如有个实现类MyClass,我这样操作:MyClass* ptr = new MyClass(); MyClass可能在不同dll版本中占的空间不同产生兼容问题,我拿一个指向MyClass的指针调用方法也会产新问题,那么,如果是指向一个接口(只含有纯虚方法

CORBA、IDL、COM和Protocol Buffer

北慕城南 提交于 2020-01-20 01:29:42
1.CORBA CORBA是一种标准,是公共对象请求代理结构(Common Object Request Broker Architecture),是由对象管理组织(Object Management Group,缩写为OMG)标准化的一种规范体系。 对象管理组织是一个国际的非盈利组织,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范。OMG是由包括IBM、Sun Microsystem、Apple和美国航空等11家公司在1989年创立的,其最初目的是开发一个分布式面向对象系统的标准。目前,对象管理组织拥有800多名公司成员,包括计算机产业和软件产业的企业,也包括其他产业的成员。 CORBA的三大核心模块为接口描述语言(或者叫接口定义语言,Interface Definition Language),对象请求代理(Object Request Broker) 和 IIOP标准(网络ORB交换协议, Internet Inter ORB Protocol)。 CORBA目前可以理解为一个Web Service。CORBA的两个重要特征是: 1)分布式系统下的跨语言的数据传输; 2)远程方法的本地调用。 2.IDL CORBA的最核心的模块为接口定义语言,即Interface Difinition Language,简写为IDL

如何编写和注册.Net的Com组件

你。 提交于 2020-01-08 04:37:13
Com+组件在vb6.0和vc++的年代是风靡一时的,当前.net framework的构件系统,因为其无需注册等优点渐渐取代了Com+的地位,但一些系统由于历史问题,还是需要com+支持的,其实在.net中编写com+组件也是一件非常简单的事情. 在vs2003中,要想生成com+组件,其实额外的工作只有一个,就是对项目按下图所示, 程序其他部分和其它没有差别,不再赘述 重点在于如何注册.net写的com+组件 网上有一些说法,但我按照其操作,均未成功,或者在程序访问的时候,出现权限问题。其实.net 写的com+组件不能直接用regsvr32.exe来注册,因为这样一来,系统会缺少元数据,我们首先需要用.net framework提供的工具regasm,将该com组件所需元数据写入注册表中,注册表允许 COM 客户程序以透明方式创建 .NET Framework 类。类一经注册,任何 COM 客户程序都可以使用它,就好像该类是一个 COM 类。在编译好的目录中,com组件会多产生一个同名的.tlb文件,regasm的用法如下:regasm /tlb: /tlb:Encrypter.tlb Encrypter.dll,此步骤经过我的实验,不可或缺。 然后,就可以利用组件服务将.net com组件设置为com服务了。设置过程中,需要注意下权限的设置就行了。 有关tlb文件的说明如下

.NET组件 vs. COM组件

ぃ、小莉子 提交于 2019-12-28 09:28:12
写在前面:我没有开发过COM组件的经验,只是在做文献综述的时候需要了解这方面的知识,所以如果哪里说错了或者是我理解错了,还希望大家可以指出,谢谢。我不是程序员也不是计算机专业,只是课题偏了这个方向,因此很多基础概念或许有理解错,真心希望可以得到大家的指正,再次感谢。 COM object以接口的方式向客户端提供服务。一个COM component可以包含多个COM object,一个COM object可以有多个接口,其关系如图1所示。 图1 COM组件、COM对象和接口关系 在Windows OS上,COM组件以.dll或者.exe的文件形式存在。其中.dll是进程内组件(in-process component),.exe是进程外组件(out-process component)。进程内组件意味着该组件会被加载到客户端所在的进程中,而进程外组件则意味着该组件会被加载到一个新的进程中。 二进制接口是COM组件中的重要概念,正是因为存在binary interface compatibility, 组件的开发语言不受限制,不一定非得是C/C++。接口是用Microsoft Interface Definition Language (MIDL)描述的。每个接口有唯一标识,使用IID(interface identifier)命名。接口都需要继承自IUnknown接口

COM组件笔记

若如初见. 提交于 2019-12-25 13:12:52
HRESULT hr; S_OK:成功执行 S_FALSE:成功的返回逻辑错误 E_FAIL:一般性失败 E_NOTIMPL:方法没有实现 E_UNEXPECTED:在不准确的时间调用了方法 二、HRESULT分为三部分: 1、严重程度位:操作是成功还是失败 2、操作码:HRESULT对应于什么技术 3、信息码:在给定的严重程度和相应的技术情况下精确地结果值 为了消除名字冲突,所有的COM组件在设计的时候被分配为一个二进制名字GUID 当GUID被用来命名COM接口是,GUID被称为类ID (CLSID) 三、COM中不允许出现多继承 COM支持一种记号表示技术:“一个对象中哪些接口是可以使用的” queryInterface类似于static_cast() COM组件中所有的字符都用OLECHAR数据类型相当于win32中的w_char_t和16为的Unicode字符,BSTR以null作为结束符的OLECHAR字符串相当于string 当把字符串作为【in】参数传入一个方法是,最好调用方法之前使用SysAllocString,在调用方法之后调用SysFreeString 当把字符串作为【out】参数输出时最好使用SysAllocString,使用完参数之后SysFreeString交给调用者调用。(如果调用者不调用会照成内存泄露) variant变体的使用

COM组件学习

北战南征 提交于 2019-12-07 10:04:58
COM组件是以Win32动态链接库(dll)或可执行的形式发布的可执行代码组成的。动态链接库本身并不能满足对于组件架构的需求。为了满足这些需求。组件还必须是封装的。 com组件是完全与语言无关的。 com组件可以以二进制形式发布。 com组件不妨碍老客户情况下升级。 com并不是一种计算机语言。 将com与dll相提并论也是不合适的。实际上com使用了Dll来给组件提供动态链接的能力。 com具有一个被称作是com库的API,他提供的是对所有客户及组件都非常有用的组件管理服务。 com组件在C++中是用纯抽象基类实现的。 一个com组件可以提供多个接口。 一个C++类可以使用多继承来实现一个可以提供多个接口的com。 客户请求服务时,只能通过接口进行。每一个接口都是有一个128位的全局唯一标识符GUID来标识 。客户通过GUID获得接口的指针,在通过接口指针,客户就可以调用其他相应的成员函数。具体功能如何实现,则完全由对象的接口内部实现。 每一个对象也用一个128位的GUID来标识,称为CLSID(类ID),客户程序可以由CLSID来创建COM对象。 接口特点: 1、二进制特性; 2、接口不变性; 3、继承性(可扩展性); 4、多态性(运行过程的多态性) COM定义的每一个接口都必须从IUnKnow继承过来。原因:IUnKnow接口提供了两个非常重要的特性: 生存期控制和接口查询

5.COM可重用性——包容

回眸只為那壹抹淺笑 提交于 2019-12-07 10:04:18
前面说的都是COM的模块化,体现COM组件的封装和多态特性,而实际上COM另一大特征是在二进制级别的可重用性,包括 包容和聚合 。本次介绍包容,下次介绍聚合。 如下,同样借用《COM原理与应用》的图,如下: 所谓 包容就是对象B在实现ISomInterface接口时,调用对象A的接口来完成这个功能 。换个角度看,其实相当于 对象B充当我们客户程序的角色 ,本来是要由B完成功能调用A来完成了,整个过程客户完全感觉不到对象A的存在,所以称作包容。 下面直接看代码实现,接着上篇博客的实现,以上文的实现的COM对象做A,本次实现新的对象B,包容对象A的IAge接口, 首先,在对象B中增加个初始化函数Init,查询得到对象A的IAge接口,如下 HRESULT CPeople::Init() { HRESULT hr = CoCreateInstance(CLSID_EasyComPeople, NULL, CLSCTX_INPROC_SERVER, IID_IAge, (LPVOID*)&m_pAge); if (FAILED(hr)) { return E_FAIL; } else { return S_OK; } } 然后,在对象B实现IAge接口功能的时候,调用对象A的IAge接口来完成这个功能, //IAge HRESULT STDMETHODCALLTYPE CPeople: