C++调用COM组件

COM是复杂的,尤其是对于C/C++这样的和COM无关的语言(VB、Delphi、E语言等快速开发工具都是从内核支持COM/ActiveX的)。

一般情况下,在C++中,一个COM组件的调用要经过以下步骤:

1、包含头文件
2、使用CoCreateInstance创建对象并获取接口指针
3、调用组件方法,夹杂着大堆的类型转换等工作
4、手工管理对象生存周期

代码看起来灰常灰常的复杂。

事实上,VC给我们提供了一种和VB一样直观的方便的调用方法。

如VB中写:

Dim http As New XMLHTTP
http.open "GET", "http://127.0.0.1/", False
http.send
Print http.responseText

在VC中完全可以写成:

IXMLHTTPRequestPtr http(__uuidof(XMLHTTP));
http->open("GET", "http://127.0.0.1/", false);
http->send();
puts(http->responseText);

当然不要忘了CoInitialize,并且文件头要写上

#import <msxml3.dll>
using namespace MSXML2;

之所以这么方便,是由于在#import的预处理中,VC编译器自动做好了用_bstr_t代替BSTR、接口的智能指针等,用户无需去纠结什么AddRef、Release啊,BSTR与char*转换这些一不小心要么是非法访问要么是内存泄漏的事情。

想起当年做彩虹插件系统的时候用WinINet API那叫一个郁闷,COM还是很强大的,但因为COM在VB、Delphi这些语言中太出风头,玩VC的童鞋就会有些郁闷,因为要深入到COM的原理,就不是一般的复杂,就算是在VC中调用,大部分的介绍都是MFC的类向导自动作出的、利用IDispatch的调用,看起来很囧的说,希望这篇文章能让玩VC的同学以后不再那么郁闷。。

One Reply to “C++调用COM组件”

Leave a Reply

Your email address will not be published. Required fields are marked *