的CComModule ::解锁();

时间:2010-05-27 08:26:21

标签: c++ com

我一直在尝试确定这个函数的功能,但是我似乎无法在CComModule类的MSDN文档中找到它。

有人能告诉我它的用途吗?

1 个答案:

答案 0 :(得分:2)

此功能适用于DllCanUnloadNow()

您知道当您为进程内服务器调用CoCreateInstance()时COM会自动调用LoadLibraryEx()以在必要时加载COM服务器DLL。但DLL保持加载多长时间?事实上,COM会定期为每个加载的COM服务器DLL调用DllCanUnloadNow()。如果它返回S_OK,则允许COM呼叫FreeLibrary()

什么时候卸载DLL是安全的?显然,在DLL实现的所有对象都被销毁之前,你无法卸载它。所以这里有“锁定计数” - 一个全局整数变量,用于计算DLL实现的活动对象的数量。

当创建一个新的COM对象时 - 从它的构造函数(通常是CComObject构造函数)调用CComModule::Lock()并递增变量,当一个对象被销毁时 - 从它调用CComModule::Unlock()析构函数并递减变量。当CComModule::GetLockCount()返回零时,表示没有活动对象,卸载DLL是安全的。

因此锁定计数与IUnknown实现的引用计数非常相似。引用计数是每个对象,锁定计数是每个COM进程内服务器。