C#中的非托管句柄,我是否需要释放或销毁?

时间:2018-04-27 02:29:15

标签: c# pointers com-interop

我有一些通过ComInterop在win32应用程序中使用的C#代码,它作为OleControl嵌入。

在我的win32应用程序中,我通过句柄发送到C#控件的包含窗口(win32应用程序代码):

oControl:ShowPreview(5, 3, INT(_CAST, SELF:Handle(0)))

在我的C#代码中,我选择了它并将其存储在IntPtr(C#代码)中:

private IntPtr _parentWindowPtr;

public int ShowPreview(int someVar1, int someVar2, int parent)
{
    ...
    _parentWindowPtr = new IntPtr(parent);
    ...
}

我应该在C#代码中释放或销毁IntPtr吗?

1 个答案:

答案 0 :(得分:2)

这是我上面评论的摘要

  

我应该在C#代码中释放或销毁IntPtr吗?

很简单,在处理Ole / COM时,你应该释放窗口句柄。 Ole Controls / COM ActiveX可以被认为是一个更高级别的UI抽象(涉及IOleControl; IOleControlSite上的协议)。您可以释放 COM引用,而不是释放窗口句柄,这最终会导致窗口被破坏并释放句柄。

在您的特定情况下,您将本机窗口的句柄传递给COM控件以嵌入其中。最佳实践是调用进程(本机exe)拥有包含窗口的所有权,因此COM控件不应该自行销毁容器。

如何在c#

中释放COM对象

提醒一下,在c#中发布COM对象的最佳做法是:

Marshal.ReleaseComObject(someComObject);

嵌入到Microsoft Word中的Excel图表不会自行关闭Word。

告诉我更多