COM编程入门:深入COM服务器
2006-07-21 11:44:59 来源:WEB开发网进程内服务器在被COM库使用之前必须满足两个条件或标准:
1、 必须正确在注册表的HKEY_CLASSES_ROOT\CLSID 键值下注册。
2、 必须输出DllGetClassObject()函数。
这是进程内服务器运行的最小需求。在注册表的HKEY_CLASSES_ROOT\CLSID 键值下必须创建一个键值,用服务器的GUID作为键名字,这个键值必须包含两个键值清单,一是服务器的位置,而是服务器的线程模型。 COM库对DllGetClassObject()函数进行调用是在CoCreateInstance() API中完成的。
还有三个函数通常也要输出:
o DllCanUnloadNow():由COM库调用来检查是否服务器被从内存中卸载。
o DllRegisterServer():由类似RegSvr32的安装实用程序调用来注册服务器。
o DllUnregisterServer():由卸载实用程序调用来删除由DllRegisterServer()创建的注册表入口。
另外,只输出正确的函数是不够的——还必须遵循COM规范,这样COM库和客户端程序才能使用服务器。
服务器生命其管理
DLL服务器的一个与众不同的方面是控制它们被加载的时间。“标准的”DLLs被动的并且是在应用程序使用它们时被随机加载/或卸载。从技术上讲,DLL服务器也是被动的,因为不管怎样它们毕尽还是DLL,但COM库提供了一种机制,它允许某个服务器命令COM卸载它。这是通过输出函数DllCanUnloadNow()实现的。这个函数的原型如下:
HRESULT DllCanUnloadNow();
当客户应用程序调用COM API CoFreeUnusedLibraries()时,通常出于其空闲处理期间,COM库遍历这个客户端应用已加载所有的DLL服务器并通过调用它的DllCanUnloadNow()函数查询每一个服务器。另一方面,如果某个服务器确定它不再需要驻留内存,它可以返回S_OK让COM将它卸载。
更多精彩
赞助商链接