我一直在尝试确定这个函数的功能,但是我似乎无法在CComModule类的MSDN文档中找到它。
有人能告诉我它的用途吗?
答案 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进程内服务器。