Welcome

首页 / 软件开发 / C++ / COM编程入门:深入COM服务器

COM编程入门:深入COM服务器2010-12-30本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口。

继上一篇COM编程入门之后,本文将讨论有关COM服务器的内容,解释编写自己的COM接口和COM服务器所需要的步骤和知识,以及详细讨论当COM库对COM服务器进行调用时,COM服务器运行的内部机制。

如果你读过上一篇文章。应该很熟悉COM客户端是怎么会事了。本文将讨论COM的另一端——COM服务器。内容包括如何用C++编写一个简单的不涉及类库的COM服务器。深入到创建COM服务器的内部过程,毫无遮掩地研究那些库代码是充分理解COM服务器内部机制的最好方法。

本文假设你精通C++并掌握了上一篇文章所讨论的概念和术语。在这一部分将包括如下内容:

走马观花看COM服务器——描述COM服务器的基本要求。

服务器生命其管理——描述COM服务器如何控制加载时间。

实现接口,从IUnknown开始——展示如何用C++类编写一个接口实现并描述IUnknown之方法的目的。

深入CoCreateInstance()——探究CoCreateInstance()的调用机理。

COM服务器的注册——描述完成服务器注册所需要的注册表入口。

创建COM对象——类工厂——描述创建客户端要使用的COM对象的过程。

一个定制接口的例子——例子代码示范了上述概念。

一个使用服务器的客户端——举例说明一个简单的客户端应用程序,用它来测试COM服务器。

其它内容——有关源代码和调试的注释。

走马观花看COM服务器

本文我们将讨论最简单的一种COM服务器,进程内服务器(in-process)。“进程内”意思是服务器被加载到客户端程序的进程空间。进程内服务器都是DLLs,并且与客户端程序同在一台计算机上。

进程内服务器在被COM库使用之前必须满足两个条件或标准:

1、 必须正确在注册表的HKEY_CLASSES_ROOTCLSID 键值下注册。

2、 必须输出DllGetClassObject()函数。

这是进程内服务器运行的最小需求。在注册表的HKEY_CLASSES_ROOTCLSID 键值下必须创建一个键值,用服务器的GUID作为键名字,这个键值必须包含两个键值清单,一是服务器的位置,而是服务器的线程模型。 COM库对DllGetClassObject()函数进行调用是在CoCreateInstance() API中完成的。

还有三个函数通常也要输出:

o DllCanUnloadNow():由COM库调用来检查是否服务器被从内存中卸载。

o DllRegisterServer():由类似RegSvr32的安装实用程序调用来注册服务器。

o DllUnregisterServer():由卸载实用程序调用来删除由DllRegisterServer()创建的注册表入口。

另外,只输出正确的函数是不够的——还必须遵循COM规范,这样COM库和客户端程序才能使用服务器。