我应该在本地定义的IntPtr变量上使用CloseHandle吗?

时间:2014-08-19 16:58:11

标签: c# console-application dllimport unmanagedresources

如果我用这个......

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

...在我的C#.Net4.5 控制台应用程序中获取控制台实例并将其分配给变量(我在调用user32&#39时将其作为hWnd参数传递; s MessageBox()方法),当我完成非托管变量时,是否需要调用kernel32' CloseHandle()方法?

当我尝试这个时,我得到一个SEHException,我的谷歌搜索似乎表明它与调试模式和早期版本的.NET有关。

问题1 - 我应该使用CloseHandle,还是只留下它并让控制台资源自行解决?

问题2 - SEHException是否完全不相关,还是因为我在尝试关闭控制台时仍未实例化?


旁注

对#43; noob问题表示抱歉&#34 ;;我接下来没有使用非托管代码的经验。

我知道有更好的方法可以做到这一点;我故意在不导入Windows.Forms

的情况下尝试这样做

1 个答案:

答案 0 :(得分:3)

永远不要在窗口句柄上调用CloseHandle。关闭窗口的正确方法是调用DestroyWindow。应该调用CloseHandle来关闭内核对象的句柄,例如窗口句柄是一个GDI对象,所以它不会被CloseHandle关闭。

然而,DestroyWindow将关闭窗口,就像您单击关闭按钮一样。因此,要回答您的根问题,不需要在代码中关闭窗口句柄。除非你想关闭控制台窗口,否则就是这样。