基于ATL的接口实现






2.46/5 (12投票s)
2002年12月10日
3分钟阅读

46698

840
本文介绍了一种仅使用 ATL 实现基于接口的对象实现的实用技术。该技术实现了关于接口的基本 COM 概念,而不依赖于 COM 运行时。
引言
本文介绍了一种仅使用 ATL 实现基于接口的对象实现的实用技术。该技术实现了关于接口的基本 COM 概念,而不依赖于 COM 运行时。
COM 基于接口编程的思想,除了基本的接口功能外,COM 还提供了更多功能,例如对象实例化、远程对象调用、进程间封送、安全性和权限、线程模型等。所有这些除了接口之外的功能都需要 COM 运行时 DLL。另一方面,接口是 COM 的基础,根据定义,它不需要 COM 运行时 DLL。由于接口在软件设计中提供了强大的功能和灵活性,并且强制客户端只能通过接口引用来访问对象,因此它将为交互式对象生成松耦合的架构,而不会影响应用程序的可扩展性。
接口的基本 COM 概念是,每个接口都有其唯一的 IID(接口 ID),并且派生自 IUnknown
:它实现了引用计数和通过 IID 查询其他接口的能力。当对象的引用计数达到零时,它可以自动释放自身。如果这些是您项目中对象之间接口的所有要求,那么这种方法就适用。而且它易于使用。
这种方法将在客户端和服务器端实现上述基本接口功能,而无需依赖任何 COM 运行时 DLL。当然,这种“基本 COM”对象不会拥有 COM 运行时提供的任何功能。如您所见,它需要自己的类工厂来实例化对象。通过利用 ATL,可以轻松编写和维护代码。既然它不需要 COM 运行时来实例化对象,那么就没有必要注册对象;它允许同一接口的不同实现并排工作——只要它们位于不同的文件夹中。此外,这种方法还为我们的代码提供了一定的可移植性,它只需要 C++ 编译器支持语言特性。它没有注册表 API 调用,也没有 COM 运行时方法调用,例如 CoInitialize
、CoUninitialize
、CoCreateInstance
等。
在服务器端,不需要 MSIL 来定义接口。IID 可以由 Visual Studio 的 GUISGen 工具生成。您可以在接口定义文件中定义类工厂方法。在声明实现类时,让它派生自 CUnknownImpl< IYourInterfaceName >
,这样您就不必关心 IUnknown
了。要实现类工厂方法,请使用 CREATE_COM_OBJECT
宏——只需一行代码。其余代码是通过 BEGIN_COM_OBJECT_MAP
和 END_COM_OBJECT_MAP
宏来声明 COM 对象;它有两个不同的宏,分别用于单例对象和非单例对象。有关详细信息,请下载演示项目。实现此想法所需的所有宏和模板都定义在一个文件中:AIBBase.h,它包含在两个下载文件中。
在客户端,只需包含接口定义头文件,例如(演示项目中的)AIBByATL.h。加载服务器 DLL 后,调用 AIBByATL_CreateObject(…)
,这是基本 COM 对象实例化的类工厂方法,然后客户端可以获得 COM 接口指针。有关详细信息,请参阅 AIBByATL_Demo.zip,它在 VC6 工作区中有两个项目,请先编译 AIBByATL,然后编译 AIBByATL_Client,您可以看到服务器实现有多么简单,客户端代码又有多么简洁。
这个想法的妙处在于,它以一种轻量级、易于使用的方式采用了最重要的接口驱动概念。因为它不依赖于任何 COM 运行时或 COM 库 DLL,所以它甚至可以在非 Microsoft 平台上实现基于接口的对象设计——只要目标平台的 C++ 编译器支持纯虚函数定义。
如果您有任何问题,请发送电子邮件至 ModestyZ@hotmail.com。