一、COMcom是一个更好的C++
1、COM
是什么
Don
Box 说"COM IS LOVE"。COM 的全称是 Component Object Model 组件对象模型。
2、从 C++
到 DLL 再到 COM
2.1 C++
如某一软件厂商发布一个类库(CMath四则运算),此时类库的可执行代码将成为客户应用中不可分割的一部分。假设此类库的所产生的机器码在目标可执行文件中占有4MB的空间。当三个应用程序都使用CMath库时,那么每个可执行文件都包含4MB的类库代码(见图1.1)。当三个应用程序共同运行时,他们将会占用12MB的虚拟内存。问题还远不于此。一旦类库厂商发现CMath类库有一个缺陷后,发布一个新的类库,此时需要要求所有运用此类库的应用程序。此外别无他法了。
图1.1 CMath 的三个客户
2.2 DLL
解决上面问题的一个技术是将CMath类做成动态链接库(DLL ,Dynamic Link Library)的形式封装起来
。
在使用这项技术的时候,CMath的所有方法都将被加到 CMath dll 的引出表(export list)中,而且链接器将会产生一个引入库(import library)。这个库暴露了CMath的方法成员的符号
。当客户链接引入库时,有一些存根会被引入到可执行文件中,它在运行时通知装载器动态装载 CMath
Dll。
当 CMath 位于dll中时,他的运行模型见图1.2
图1.2 CMath引入库
2.3 COM
"简单地把C++类定义从dll中引出来"这种方案并不能提供合理的二进制组件结构。因为C++类那既是接口也是实现。这里需要把接口从实现中分离出来才能提供二进制组件结构。此时需要有二个C++类,一个作为接口类另一个作为实现类。让我们开始COM之旅吧。
二、COM基础
1.COM基本知识
1.1返回值HRESULT
COM要求所有的方法都会返回一个HRESULT类型的错误号。HRESULT 其实就一个类型定义:
typedef LONG HRESULT;
有关HRESULT的定义见 winerror.h 文件
//
// Values are 32 bit values layed out as follows:
//
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +---+-+-+-----------------------+-------------------------------+
// |Sev|C|R| Facility | Code |
// +---+-+-+-----------------------+-------------------------------+
//
// where
//
// Sev - is the severity code
//
// 00 - Success
// 01 - Informational
// 10 - Warning
// 11 - Error
//
// C - is the Customer code flag
//
// R - is a reserved bit
//
// Facility - is the facility code
//
// Code - is the facility's status code
我们一般下面的宏来判断方法是否成功:
#define SUCCEEDED(hr)(long(hr)>=0)
#define FAILED(hr)(long(hr)<0)
1.2
初识 IDL
每个标准的COM组件都需要一个接口定义文件,文件的扩展名为IDL。让我们看IUnknow接口的定义文件是怎样的。
[
local,
object,
uuid(00000000-0000-0000-C000-000000000046),
pointer_default(unique)
]
interface
IUnknown
{
typedef [unique]
IUnknown *LPUNKNOWN;
cpp_quote("//////////////////////////////////////////////////////////////////")
cpp_quote("// IID_IUnknown and all other system IIDs are provided in UUID.LIB")
cpp_quote("// Link that library in with your proxies, clients and servers")
cpp_quote("//////////////////////////////////////////////////////////////////")
HRESULT QueryInterface(
[in]
REFIID riid,
[out,
iid_is(riid)]
void **ppvObject);
ULONG
AddRef();
ULONG
Release();
}
[
object,
uuid(00000001-0000-0000-C000-000000000046),
pointer_default(unique)
]
[local]属性禁止产生网络代码。
[object]属性是表明定义的是一个COM接口,而不是DEC风格的接口。
[uuid]属性给接口一个GUID。
[unique]属性表明null(空)指针为一个合法的参数值。
[pointer_defaul]属性所有的内嵌指针指定一个默认指针属性
typedef [unique] IUnknown *LPUNKNOWN;这是一个类型定义
cpp_quote这个比较有趣,这是一个在idl文件写注解的方法。这些注解将保存到***.h和***_i.c文件中
[in]表示这个参数是入参
[out]表示这个参数是出参
[iid_is(riid)]表示这个参数需要前一个的riid参数。
注意:所有具有out属性的参数都需要是指针类型。
1.3 IUnkown接口
在整个例子除了IUnkown这个东西,其他应该不会感到陌生吧!COM要求(最基本的要求)所有的接口都需要从IUnknown接口直接或间接继承,所以IUnknown接口有"万恶之源"之称。
IUnkown接口定义了三个方法。
HRESULT QueryInterface([in] REFIID riid,[out] void **ppv);
ULONG AddRef();
ULONG Release();
其中 AddReft() 和Release()负责对象引用计数用的,而
QueryInterface()方法是用于查询所实现接口用的。每当COM组件被引用一次就应调用一次AddRef()方法。而当客户端在释放COM组件的某个接口时就需要调用Release()方法。
这里所讲的请在下面的例子仔细体会。
相关推荐
C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++
Google C++ 风格指南 - 中文版
C++编码规范 帮助大家更好的书写C++程序,一个人的编写风格会决定一个人以后在一个企业里的发展位置。
包括了280个小程序,可帮助刚刚学习c++的人更好的掌握这门技术
使用C++做好看的登陆界面
很好看的登录界面 c++
一个很简单的c++编写的记事本,能实现记事本所有功能。
用C++封装好的一个环形缓冲区代码,各位需要的可以拿去
用c++实现在一个txt文件中查找字符,算法就是字符串匹配,没什么技巧性,最后还给出了运行时间,适合初学者参考
一个c++转c的工具(cfront源码),很好的工具源代码。满足特殊人使用。
设计一个高效率的类型(class 型别)
如果读者有其他编程语言背景或计算机相关基本知识可以帮助更好的理解教程内容,但这并非必须条件。 对于C语言熟悉的读者可将前三章(1.1 到 3.4)当作复习,因为这部分内容主要介绍C++中的C部分。不过某些C++的语法...
学长用C++做的一个聊天室程序,希望对大家的学习有帮助
这个一个老外写的矩阵类,用C++实现,注释详细,把线性代数里用到的加减乘除和转置、求逆等矩阵运算都实现了,小可查到并修改了几个小错误,几近完美了。
11.5.2 创建一个简单的COM组件——例程MTSServ 11.5.3 MTS Explorer 11.5.4 将Account组件添加到MTS环境中 11.5.5 运行并监控Account组件 11.6 微软消息队列(MSMQ) 11.6.1 何谓MSMQ 11.6.2 MSMQ的好处 11.6.3 MSMQ...
Nurbs 曲线 C++Nurbs 曲线 C++
《小学生C++趣味编程》以单元和课的形式编排、符合小学生认知特点的编程入门书,知识点依次呈现,深入浅...懂C++的程序员用这套资源就可以启蒙小孩了,不必化上万培训费、也不必风吹雨打去上课,而且能让孩子学得更好!
一个makefile文件的例子。这个makefile可以自动搜索代码,无需人为添加。目前只支持c++,可以生成可执行程序,共享库和静态库。
这是一个矢量图工具,C++实现这是一个矢量图工具,C++实现这是一个矢量图工具,C++实现
最好用的单元测试工具,除了这里你是找不到9.0版本的破解的。 www.edukit.com.cn/...由于CSDN上传限制,一下子上传不了,请查看我的下载,找其它两个。 这个是:plugins-c++Test For Visual Studio.7z