COM逐步教程2011-04-25Saurabh Dasgupta介绍对于我来说,理解COM(Component Object Model,组件对象模型)绝不亚于 一次长途旅行。我相信,每一个想要理解COM之后基本原理的程序员都必须使用普通的C++编 写至少一个简单的COM对象,也就是说,不依靠MFC/ATL所提供的任何模板或宏的支持。在本 文中,我将要逐步介绍如何从基本原理出发来创建简单的COM对象。这些组件可用于VC/VB的 客户端程序。作为练习,我们将要尝试设计一个COM组件,这一组件将要实现假想的 快速相加算法。它必须传入两个长数据类型的参数,并返回另一个长参数给用户,也就是相 加算法的结果。我们现在开始设计接口。接口COM对象的接口并不涉及到实际 的实现,但是它的方法则标志着COM对象中用来和外界通信的部分。我们将我们的接口命名为 IAdd,它的声明使用接口定义语言(Interface Definition Language,IDL)。IDL是用来定 义函数标志的语言,它独立于各种程序语言之间,这就使得RPC底层能够在不同的计算机之间 对参数进行打包、装载与解包。在我们的IAdd接口中,我们拥有SetFirstNumber和 SetSecondNumber方法,它们用来传递加法的参数。还有一个方法,DoTheAddition,它用来 完成加法并将结果回传给客户端。第1步:创建一个新的Win32 DLL工程(比 如说AddObj),我们将会在这个文件夹中创建接下来的所有文件。创建一个空文件,然后键 入以下内容。将它保存为IAdd.idl。接口的标识符可以使用工具uuidgen.exe来生成。import "unknwn.idl";
[
object,
uuid (1221db62-f3d8-11d4-825d-00104b3646c0),
helpstring("interface IAdd is used for implementing a super-fast addition Algorithm")
]
interface IAdd : IUnknown
{
HRESULT SetFirstNumber(long nX1);
HRESULT SetSecondNumber(long nX2);
HRESULT DoTheAddition([out,retval] long *pBuffer);
};
[
uuid(3ff1aab8-f3d8-11d4-825d-00104b3646c0),
helpstring("Interfaces for Code Guru algorithm implementations .")
]
library CodeGuruMathLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
interface IAdd;
}