C# 中的非托管句柄,我需要释放还是销毁?
Unmanaged handle in C#, do I need to release or destroy?
我有一些 C# 代码通过 ComInterop 在 win32 应用程序中使用,它作为 OleControl 嵌入。
在我的 win32 应用程序中,我通过句柄发送到包含 window 的 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?
这是我上面评论的总结
Should I be releasing or destroying the IntPtr in the C# code?
很简单,在处理 Ole/COM 时,您应该 而不是 释放 window 个句柄。 Ole Controls/COM ActiveX 可以被认为是更高级别的 UI 抽象(涉及 IOleControl
;IOleControlSite
协议),高于 windows。您释放 COM 引用 而不是释放 window 句柄,这最终导致 window 被销毁并释放句柄。
在您的特定情况下,您将本机 window 的句柄传递给您的 COM 控件以将其自身嵌入其中。最佳做法是调用进程(本机 exe)拥有包含 window 的所有权,因此 COM 控件不应自行破坏容器。
如何在 c# 中释放 COM 对象
提醒一下,在 C# 中释放 COM 对象的最佳做法是:
Marshal.ReleaseComObject(someComObject);
嵌入到 Microsoft Word 中的 Excel 图表不会自行关闭 Word。
告诉我更多
- Proper way of releasing COM objects?
- IOleControl interface
- IOleControlSite interface
我有一些 C# 代码通过 ComInterop 在 win32 应用程序中使用,它作为 OleControl 嵌入。
在我的 win32 应用程序中,我通过句柄发送到包含 window 的 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?
这是我上面评论的总结
Should I be releasing or destroying the IntPtr in the C# code?
很简单,在处理 Ole/COM 时,您应该 而不是 释放 window 个句柄。 Ole Controls/COM ActiveX 可以被认为是更高级别的 UI 抽象(涉及 IOleControl
;IOleControlSite
协议),高于 windows。您释放 COM 引用 而不是释放 window 句柄,这最终导致 window 被销毁并释放句柄。
在您的特定情况下,您将本机 window 的句柄传递给您的 COM 控件以将其自身嵌入其中。最佳做法是调用进程(本机 exe)拥有包含 window 的所有权,因此 COM 控件不应自行破坏容器。
如何在 c# 中释放 COM 对象
提醒一下,在 C# 中释放 COM 对象的最佳做法是:
Marshal.ReleaseComObject(someComObject);
嵌入到 Microsoft Word 中的 Excel 图表不会自行关闭 Word。
告诉我更多
- Proper way of releasing COM objects?
- IOleControl interface
- IOleControlSite interface