学习利用COM组件
来源:互联网 发布:淘宝拍单免费送衣服 编辑:程序博客网 时间:2024/05/06 14:25
From My Blog(http://bloglong123king.sourceforge.net/?p=193)
一、简介
COM(Component Object Model, 组件对象模型)是一种用来创建可以交互的软件组件的平台无关的、分布式的、面向对象的系统。
COM is a platform-independent, distributed, object-oriented system for creating binary software components that can interact.
COM is the foundation technology for Microsoft's OLE (compound documents) and ActiveX® (Internet-enabled components) technologies, as well as others.
OLE以及ActiveX都是以COM为基础的;COM组件需要由面向对象的语言开发。
二、COM的构成
COM的核心内容是Object对象,Object会向使用COM的客户程序Client暴露一组或者多组的相关函数,每一组相关的函数称为一个接口Interface。
每个接口都必须继承自IUnknown接口。IUnknown接口提供三个函数:
QueryInterface
- HRESULT QueryInterface(
- REFIID iid,
- void ** ppvObject
- );
AddRef
- ULONG AddRef(void);
Release
- ULONG Release(void);
一个Object通常会暴露多个Interface,如果Client当前已经得到了其中的一个接口InterfaceA,但是Client想要访问该Object的另外一个接口InterfaceB,这里Client应该调用QueryInterface方法:
- InterfaceA* interface_a = ...;
- InterfaceB* interface_b;
- HRESULT hResult = interface_a.QueryInterface(IID_INTERFACEB, &interface_b);
- if (hResult == S_OK){
- ...
- }
三、怎样查看本机提供哪些COM服务
通过RegDllView(http://www.nirsoft.net/utils/registered_dll_view.html)工具,可以查看到当前系统中注册的COM组件的image path以及类的GUID等信息。
我们随便选取其中的一个COM服务的image用CFF Explorer(http://www.ntcore.com/exsuite.php)查看信息,发现它的导出函数只有4个:
其中,DllGetClassObject的原型如下:
- HRESULT DllGetClassObject(
- REFCLSID rclsid,
- REFIID riid,
- LPVOID* ppv
- ) throw( );
这个函数与QueryInterface比较类似,都是获取一个COM组件提供的某个接口对象。
区别在于:
- QueryInterface是在已经知道了该COM组件暴露的一个接口的前提下,再获取到该组件的其他接口;
- 而DllGetClassObject是在知道该组件的CLSID以及需要访问接口的IID的情况下,要获取COM的相应接口。
你可以这样认为,我们第一次获取某个组件的接口,使用DllGetClassObject,而以后就可以调用刚刚获取到的接口的QueryInterface成员来继续获取该组件的其他接口了。
四、以VirtualBox SDK为例学习在C++程序中调用COM组件
利用VirtualBox SDK需要做以下准备工作:
- 安装VirtualBox(https://www.virtualbox.org/)
- 下载VirtualBox SDK(http://download.virtualbox.org/virtualbox/),到对应版本的目录下去找sdk包下载;解压到某个本地目录(假设为SDK_DIR)
- 打开Windows命令行,cd到SDK_DIR\installer目录(在Windows7下可以先通过资源管理器进入SDK_DIR\installer目录,再通过Shift+F10, w快速打开命令行), 执行vboxapisetup.py build,以及vboxapisetup.py install安装sdk到系统中
- 通过Visual Studio新建一个C++ Console项目,注意不要勾选
- 将SDK_DIR\bindings\mscom\lib\VirtualBox_i.c以及SDK_DIR\bindings\mscom\include\VirtualBox.h拷贝并添加到新建的C++项目中去
- VirtualBox SDK的文档在SDK_DIR\sdk\docs\html\index.html页面
接下来我们可以添加如下代码:
- #include "VirtualBox.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- CoInitialize(NULL);
- IVirtualBox* pVirutalBox = NULL;
- HRESULT hr = CoCreateInstance(CLSID_VirtualBox,
NULL,
CLSCTX_ALL,
IID_IVirtualBox,
(void**)&pVirutalBox); - if (SUCCEEDED(hr) && (pVirutalBox != NULL))
- {
- BSTR pszSettingsPath = NULL;
- HRESULT hResult = pVirutalBox->get_SettingsFilePath(&pszSettingsPath);
- if (hResult != S_OK)
- {
- printf("We got some error, 0x%08X\n", hResult);
- }
- wprintf(L"VirtualBox Settings Path : %s\n", pszSettingsPath);
- }
- CoUninitialize();
- return 0;
- }
- 学习利用COM组件
- 利用现有的COM组件
- 利用反射调用COM组件
- COM组件学习笔记--COM组件示例
- COM组件---学习
- 学习COM组件编程
- 学习COM组件编程
- Com组件相关学习
- 学习com组件
- 学习COM组件编程
- com组件学习博客
- 学习COM组件编程
- COM组件学习
- COM组件学习资料
- VC++利用ATL开发COM组件
- 利用com组件读取jpg格式图片
- 利用RegSvr32来注册.NET COM组件
- 利用RegSvr32来注册.NET COM组件
- android4.2.2修改状态栏透明
- 书是家中最美的装饰
- log4j的优点和正确配置
- iphone手机怎么/如何下载youtube
- gtk开发的c文件源码编译命令
- 学习利用COM组件
- 修改图片大小和质量 C#
- TinyXML2 学习
- 程序员成长中的九重境界 你属于哪一重?
- MYSQL数据库的索引、视图、触发器、游标和存储过程
- 【吐槽篇之经验<四>】如何运用Stand-Alone Profiler定位.NET代码级问题
- 3个信号表明你天生有领导的潜质
- ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(一)
- android布局学习