gpt4 book ai didi

COM 互操作引用计数指南

转载 作者:行者123 更新时间:2023-12-03 18:00:03 24 4
gpt4 key购买 nike

最近我花了很多时间编写各种 Visual Studio Extensions 项目。即使这些项目都是访问核心 VS 服务的托管代码,仍然需要使用旧式 COM 接口(interface)。

这是一个例子:

var selectionTracker = (IVsMonitorSelection)serviceProvider.GetService(typeof(SVsShellMonitorSelection));
IntPtr ppHier;
uint pitemid;
IVsMultiItemSelect ppMIS;
IntPtr ppSC;
selectionTracker.GetCurrentSelection(out ppHier, out pitemid, out ppMIS, out ppSC)))

如您所见,此调用返回 2 个指针(ppHier 和 ppSC)和一个对象 ppMIS。
问题是:我应该如何在 COM 引用计数方面发挥出色。

我的理解是,在 COM 世界中,当一个方法返回一个指向对象的指针时,这个指针在返回之前是 AddRef 的。这意味着为了防止 COM 对象泄漏,我必须在使用完它们时释放它们。

我还假设我作为一个对象得到的它已经被包装到一个 RCW 中,它会在它完成时负责引用释放。

应用于上述调用的这两个假设意味着我必须确保在我的 2 个指针上调用“Marshal.Release”,但对于返回的对象,我不应该对引用计数做任何事情。

重新表述我的问题:假设我正在使用的 COM 对象是按照 COM 规则播放的,那么上面的方法是处理 COM 引用计数的正确方法吗?

最佳答案

在这种特殊情况下,您需要在 IntPtr 变量上调用 Marshal.Release,否则它们不会消失。当然,如果您告诉编码器直接使用对象(或特定类型),那么您无需担心它,因为 RCW 将确保对象在将来的某个时间点被销毁(即当调用终结器时)垃圾收集过程)。

当然,终结器方法可能发生在一个不确定的时间点,因此如果对象维护一些您需要摆脱的资源,理想情况下应该调用 Marshal.ReleaseComObject 以在包装器为您释放之前减少其引用计数。

关于COM 互操作引用计数指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com