用C实现的一个基本COM接口IFoo(一)

把该文中实现的代码整理汇总到一个项目中。目前只是实现到一个中间阶段,重点在说明COM接口的实现原理,还没有包含类厂的部分。以后还需陆续添加类厂等高级功能。

文件组成:

ifoo.h    COM接口IFoo,接口ID IID_IFoo 声明文件。

outside.c   COM接口实现。这里实现IFoo的是一个结构体COutside.

util.h    一些宏定义、全局函数、变量声明文件。

main.c    笔者为实现项目添加的文件。提供main函数、内存管理函数Alloc,Free的实现(封装C运行库函数malloc和free.)、接口ID定义。

COM接口到底是什么?

COM接口是一个指向虚函数表的指针。通过这个指针可以访问内存中某处的各个功能块,执行预定义的功能,完成用户的任务。这些功能块以函数的形式存在(想不出还有其他形式:))并被调用。它们有一个共同点:都包含一个指针参数,指向这些功能要操作的数据地址。在C++中,这个地址就是对象的首地址,也就是类成员函数中隐含的this指针。在C函数中并没有这种现成的便利,因此代码实现中在接口定义时仍使用了接口指针(HRESULT (__stdcall * QueryInterface)   (IFoo * This,  const IID * const, void **)),而在接口函数实现时根据结构体布局结构,从这个接口指针推算得到对象实例指针。

typedef struct IFoo
{
 struct IFooVtbl * lpVtbl;
} IFoo;
typedef struct IFooVtbl IFooVtbl;
struct IFooVtbl
{

 HRESULT (__stdcall * QueryInterface)   (IFoo * This,  const IID * const, void **) ;
 ULONG (__stdcall * AddRef)    (IFoo * This) ;
 ULONG (__stdcall * Release)   (IFoo * This) ;

 HRESULT (__stdcall * SetValue)         (IFoo * This,  int) ;
 HRESULT (__stdcall * GetValue)         (IFoo * This,  int *) ;
};

COM接口的要求:

每一个COM接口(指向的虚函数表)的头三个函数必须是IUnknown接口的函数:QueryInterface,AddRef和Release.在C++中,称为从IUnknown接口继承。

对于调用QueryInterface响应查询IID_IUnknwon得到的接口指针值,同一个对象实现的所有接口必须相同。这是判断两个COM对象是否是同一个对象的标准。

宏定义“#define IUNK_VTABLE_OF(x) ((IUnknownVtbl *)((x)->lpVtbl))”说明

时间: 2024-12-21 05:10:33

用C实现的一个基本COM接口IFoo(一)的相关文章

用C实现的一个基本COM接口IFoo(二)

在C实现COM接口系列1中实现的com接口IFoo与使用它的客户耦合在一起,没有实现在各自分离的模块,因此不符合模块化编程思想.本期添加类厂支持,以使接口的实现与接口的使用相分离. --------------------------------------------------- 类厂的作用到底是什么? 将接口的实现与客户使用分离开来吗? 不尽然.使用CoCreateInstance,客户可以完全不必知道类厂的存在,而创建组件,获取组件实现的接口并使用. 即COM库可以完全抛开类厂的概念,而

webservice接口-我要用java调用WebService (被调用的是一个短信接口下面给详细说明)

问题描述 我要用java调用WebService (被调用的是一个短信接口下面给详细说明) 我要用java调用WebService (被调用的是一个短信接口下面给详细说明)希望能按照这个 那边给我的文档:接口原型:sendMessage ();接口路径:http://58.53.194.80/swdx/services/APService?wsdl[参数说明]:参数名称 数据类型 说明ApName String SP帐号ApPassword String SP密码compcode String

php ctrix-我现在想调用一个sharepoint的接口,这个接口返回的是xml数据,

问题描述 我现在想调用一个sharepoint的接口,这个接口返回的是xml数据, 可是这个接口只能在服务器的浏览器上访问,在本地访问不了,因为在本地我要访问那个网站,需要通过ctrix登录,,现在我不知道在本地如何才能利用这个接口,

一个Go语言接口和多操作系统实现的简单例子

尽管不是纯的OO语言,Go仍然提供了interface接口的功能,能够非常轻松地实现抽象与具体实现的分离.另外,按照文件名格式匹配的模式,Go程序可以自动帮你加载符合当前操作系统的对应接口实现(分析了编译时的.a包,发现编译时候自动匹配,并只把符合当前操作系统的实现打包),不需要程序员在程序里面使用if-else或者switch去实现,还算比较省心. 下面的例子,首先定义一个接口 I.接口I只有两个public的方法:Get() 和 Put().注意方法名首字母必须大写.具体代码如下: //my

一个引用java接口但任何没有实现的源码解读

问题描述 一个引用java接口但任何没有实现的源码解读 有个类一直无法理解,情况是这样的,该类有个内部接口,确定没有任何实现方法,怀疑代码不全需要自己补充,请高手支招确定下,第一次发帖,望大家捧捧场,谢谢! PresenceEventDispatcher继承的一个引用自己内部接口的抽象类,有"<"刚被csdn隐藏了 public class PresenceEventDispatcher extends EventDispatcher<PresenceEventDispat

数据-图像通过显卡传输到另外一个显示器的接口函数

问题描述 图像通过显卡传输到另外一个显示器的接口函数 我想实现上位机加载图片后,点击按钮下发,通过接口函数将图片的数据输入到显卡上,显卡外接另一个显示器,将输入的图片数据流显示在外接显示器上,这里图片下发到显卡的接口函数是什么??听说是DirectX,也不知道对不对,c++如何去编写 解决方案 这个需要你的显卡支持,双头显卡可以同时接两个显示器,在两个显示器上同时显示 解决方案二: 上位机下发图片的接口函数是什么?

android-java中的Query接口是一个怎么样的接口

问题描述 java中的Query接口是一个怎么样的接口 听说Jquery是插件, java中的Query接口是一个怎么样的接口,接口就是一种特殊的类,里面有很多常量还有未实现的抽象方法, 解决方案 jquery是js,不是java的库. 解决方案二: Query接口学习笔记 解决方案三: 请参考我写的文章:http://blog.csdn.net/wanghang1208/article/details/49923405.

怎样让一个类的接口只能由另外一个特定的类使用啊?除了继承,有没有其他方法

问题描述 怎样让一个类的接口只能由另外一个特定的类使用啊?除了继承,有没有其他方法? 解决方案 解决方案二:类的接口?解决方案三:你说的是方法吧?这个方法增加个参数,这个参数就是你说的特定类.这样就可以了.别的就没法用了.解决方案四:类的函数吧,继承接口的

苹果新款Mac只为我们留了一个新型Type-C接口

摘要: 人们的电子设备越来越多了,电脑的USB接口却越来越少,苹果新款Mac甚至只为我们留了一个新型Type-C接口. InfiniteUSB(无尽的USB)可以完美解决接口不足这个问题.如题图所示,这根充 人们的电子设备越来越多了,电脑的USB接口却越来越少,苹果新款Mac甚至只为我们留了一个新型Type-C接口. InfiniteUSB(无尽的USB)可以完美解决接口不足这个问题.如题图所示,这根充电线的特别之处在,接口可以不断叠加,一直延伸,同时为数个设备充电:型号包含安卓的MicroUS