在 COM 中:我应该在 CoCreateInstance 之后调用 AddRef 吗?

Posted

技术标签:

【中文标题】在 COM 中:我应该在 CoCreateInstance 之后调用 AddRef 吗?【英文标题】:In COM: should I call AddRef after CoCreateInstance? 【发布时间】:2010-10-13 07:34:35 【问题描述】:

CoCreateInstance 是在我正在创建的接口上自动调用 AddRef 还是应该在之后手动调用它?

【问题讨论】:

【参考方案1】:

与 COM 的合同是任何时候你从这样的函数中获得一个对象,例如 CoCreateInstance()、QueryInterface()(这是 CoCreateInstance() 最终调用的)等,被调用者总是在调用 AddRef() 之前返回,调用者(你)总是在你完成后 Release()。

您可以使用 CComPtr 使这更简单,而且它只是做正确的事。

现在,如果您需要将此指针传递给另一个希望它在对象生命周期之后可用的对象,那么您需要在传递它之前调用 AddRef()。

我推荐Essential COM by Don Box 进一步阅读此主题。

【讨论】:

虽然已经 12 岁了,但“Essential COM”仍然在不断奉献。即使作为一个 .NET 人,我仍然会返回并深入研究它。 Essential COM 的 +1(因为它不能更多)。应该注意,“资源管理和 IUnknown”部分 (p53) 告诉您要获得 100% 正确的引用计数所需知道的一切。【参考方案2】:

简而言之:

不需要在您的代码中调用AddRef。

COM 对象 的引用计数器在CoCreateInstance 之后为1。

所以,如果你调用Release,引用计数器将为0,COM对象将被释放。

【讨论】:

【参考方案3】:

规则的一个例外:CComObject::CreateInstance() 不执行 AddRef。调用后必须这样做。

【讨论】:

以上是关于在 COM 中:我应该在 CoCreateInstance 之后调用 AddRef 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该允许“。”在网址中?

从 C++ 调用 C# com 对象,谁应该释放内存?

我应该如何在 android 中使用 JWT?

在 URL 中,空格应该使用 %20 还是 + 编码? [复制]

是 nginx 服务器特有的 CORS 错误还是我应该在我的代码中添加一些内容

MVC:我应该在哪里格式化数据?