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的同学以后不再那么郁闷。。
技术贴。。。