我有一些通过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吗?
答案 0 :(得分:2)
这是我上面评论的摘要
我应该在C#代码中释放或销毁IntPtr吗?
很简单,在处理Ole / COM时,你应该不释放窗口句柄。 Ole Controls / COM ActiveX可以被认为是一个更高级别的UI抽象(涉及IOleControl
; IOleControlSite
上的协议)。您可以释放 COM引用,而不是释放窗口句柄,这最终会导致窗口被破坏并释放句柄。
在您的特定情况下,您将本机窗口的句柄传递给COM控件以嵌入其中。最佳实践是调用进程(本机exe)拥有包含窗口的所有权,因此COM控件不应该自行销毁容器。
提醒一下,在c#中发布COM对象的最佳做法是:
Marshal.ReleaseComObject(someComObject);
嵌入到Microsoft Word中的Excel图表不会自行关闭Word。