服务器生命其管理
DLL服务器的一个与众不同的方面是控制它们被加载的时间。“标准的”DLLs被动的并且是在应用程序使用它们时被随机加载/或卸载。从技术上讲,DLL服务器也是被动的,因为不管怎样它们毕尽还是DLL,但COM库提供了一种机制,它允许某个服务器命令COM卸载它。这是通过输出函数DllCanUnloadNow()实现的。这个函数的原型如下:
HRESULT DllCanUnloadNow();
当客户应用程序调用COM API CoFreeUnusedLibraries()时,通常出于其空闲处理期间,COM库遍历这个客户端应用已加载所有的DLL服务器并通过调用它的DllCanUnloadNow()函数查询每一个服务器。另一方面,如果某个服务器确定它不再需要驻留内存,它可以返回S_OK让COM将它卸载。
服务器通过简单的引用计数来确定它是否能被卸载。下面是DllCanUnloadNow()的实现:
extern UINT g_uDllRefCount; // 服务器的引用计数HRESULT DllCanUnloadNow(){ return (g_uDllRefCount > 0) ? S_FALSE :S_OK;}
如何处理引用计数将在下一节涉及到具体代码时讨论。