c语言windows库函数,C语言访问Windows COM组件函数

COM(Component Object Model)是Windows里常用的组件对象模型,在Windows上是可以上升到操作系统级别,甚至到网络分布式级别的面象对象技术,也就是按照微软定义的标准实现的COM组件,不仅可以在本地Windows操作系统上让其它程序调用,而且可以供网络内的其它系统调用(DCOM)。

OLE是对象连接/嵌入技术,它其实就是COM,只是在COM的标准上主要增加了自动化功能,OLE大家最熟悉的应用就是在窗口程序上嵌入IE内核(WebBrowser类),然后程序通过WebBrowser提供的接口与里面的网页交互,然后就有了我们的遨游,360浏览器等等。而且OLE是脚本语言最重要的精神支持者之一

另外要指出的是COM是一种对象建模模型,任何人都可以使用这种模型为自己的项目建模,像腾讯的QQ软件,整个窗口上就嵌了一个OLE对象,但他们却又没有完全按照标准去写的,你无法拿到这个对象的包含的其它对象、属性和方法,这也是肯定的,要随便让人拿到那QQ软件就随便被其它程序控制了。

本文是以讲Windows上C语言访问COM为主的文章,并不打算讨论COM的实现细节,如果要了解COM的技术细节,可以参考微软的MSDN。文章后面附有我以前用汇编写的COM调用函数,我现在基本上不写汇编了,发上来是希望它能对汇编的学习人员提供帮助。

COM整个模型实现是比较复杂的,但最后我们拿到的对象结构却是很简单的,它的结构如下图:

28781974_1.jpg

上图可以看出来,之所以我们经常把对象指针称为ppv,因为它是指向一个指针,这个指针指向对象的函数表vtable。函数表的顺序及每个函数的定义是根据不同的接口有不同的定义的,但在Windows的COM上面,所有接口都是实现IUnknown接口的,所以前三个函数肯定是IUnknown定义的方式,即QueryInterface,AddRef,Release.AddRef和Release是提供系统真正释放对象的信息,觉得我没有必要多说,QueryInterface就是查询且取得这个组件的其它接口。

每一个对象包含自己的私有变量,它在指向vtable变量接下来的连续空间里,如果是你自己实现的当然好找到变量位置,如果是别人实现的嘛,只有靠兴趣去研究了。我觉得唯一需要强调的是C语言调用vtable里的函数的时候,不要忘了第一个参数,这个参数即是对象自身的引用,它是在MSDN中的函数声明里没有公开写出来的,但实际却存在的实体。

所以,例如访问COM的Release的时候,就要按照如下方式:

接下来是自动化IDispatch接口,IDispatch接口也是标准的COM实现,只是,标准的IDispatch不需要它的调用者知道vtable的排列次序。就是你的vtable不管怎么排(当然IDispatch自己的函数QueryInterface,AddRef,Release,GetTypeInfoCount,GetTypeInfo,GetIDsOfNames,Invoke 这七个函数是标准排的,其它的函数都可以在vtable里随便排,就算开发人员改了后面vtable的结构,也同样可以使用IDispatch的Invoke函数正确地调用到。IDispatch对于对象的变量也是这样的“自动化”操作,只要你知道函数的形式和变量名,你就可以正确调用。

IDispatch提供的四个函数大致吹一下:

GetTypeInfoCount取得对象的信息数量

GetTypeInfo取得对象的信息,这些信息包括接口信息,接口的函数信息,接口的变量信息等。有了这两个函数,就可以了解这个对象的所有数据类型了。用过javascript的都知道javascript有一个for..in结构可以取得一个对象的所有变量和函数,在windows上,最终就是这两个函数提供的数据支持。当然你自己写的COM这两个函数可以不提供任何信息,以达到保护的目的。

GetIDsOfNames通过变量/函数名称取得这个变量/函数的ID。

Invoke包括读/写变量,调用函数,是通过上面得到的ID直接调用的。

我写的这个函数库,主要以调用IDispatch接口为主,当然也可以调用COM。代码可以很方便使用,如果不满足读者的需求,可以参考我的代码写成自己需要的。函数库的文件定义如下:

最后附带一个调用该函数库的例子,例子是调用Word服务将Word转换成纯文本文件。

源代码下载:点击这里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值