c++ - CComModule::Unlock();

标签 c++ com

我一直在尝试确定此函数的作用,但我似乎无法在 CComModule 类的 MSDN 文档中的任何地方找到它。

谁能告诉我它是干什么用的?

最佳答案

此函数用于 DllCanUnloadNow()才能正常工作。

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

什么时候卸载 DLL 是安全的?显然,在 DLL 实现的所有对象都被销毁之前,您不能卸载它。所以这里出现了“锁定计数”——一个全局整数变量,用于计算 DLL 实现的事件对象的数量。

创建新的 COM 对象时 - CComModule::Lock() 从其构造函数(通常是 CComObject 构造函数)调用并递增变量,当对象被销毁时 - CComModule::Unlock() 从其析构函数中调用并递减变量。当 CComModule::GetLockCount() 返回零时,这意味着没有事件对象并且卸载 DLL 是安全的。

所以锁计数很像IUnknown实现的引用计数。引用计数是针对每个对象的,锁定计数是针对每个 COM 进程内服务器的。

关于c++ - CComModule::Unlock();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2919525/

相关文章:

c++ - 我如何使用多维数组存储多个元素,然后检索元素

c++ - std::array<const T, n> 与 std::array<T, n> 重载解析

c++ - Python bool 转换为 C++ (pybind11)

com - IDA Pro 中是否可以将结构体字段偏移到 .data 段中定义的 vtable?

c# - ASP.NET WebApi 无法与 Azure 中的 COM (Excel) 配合使用

c++ - 通过指向其派生类的指针访问类对象是否会违反严格的别名规则?

c++ - 如何根据 bool 值保存具有不同扩展名的文件

exception - JavaScript中的ATL COM错误信息

c# - 有没有类似于 Silverlight 的 AutomationFactory for .NET 的类?

excel - Powershell - 添加捕获以在没有 Excel 进程的情况下进行拾取