为什么我们不需要关闭ShellExecute返回的句柄?

时间:2010-05-06 10:41:50

标签: winapi shellexecute

成功时,ShellExecute返回一个句柄。

我们需要关闭这个句柄,如果是这样,怎么样?

根据Microsoft发布的示例,我们需要 not 关闭此句柄。但ShellExecute本身的文档在这个主题上是静音的。你能否证实我们确实不需要关闭这个句柄?

但是,如何处理有效并且不需要关闭???以下哪一项陈述是正确的:

  1. 句柄无效,我们无法用它做任何事情;
  2. 句柄永远不会被释放,并且(微软赞助的)内存泄漏(直到调用者程序结束);
  3. 系统会在某个时间自动释放句柄,之后再也不会重复使用( - >另一种资源泄漏)。只有在尝试使用它时,我们才能知道它是否仍然指向某种东西。
  4. 还有什么?

3 个答案:

答案 0 :(得分:4)

取自:http://msdn.microsoft.com/en-us/library/bb762153%28VS.85%29.aspx

  

如果函数成功,则返回a   值大于32.如果是函数   失败,它返回一个错误值   表示失败的原因。   返回值被转换为   HINSTANCE用于向后兼容   使用16位Windows应用程序。的 它   然而,这不是真正的HINSTANCE 。它   只能转换为int和   与32或以下相比   错误代码如下。

答案 1 :(得分:4)

该实例是16 bit thing,在win32中,它只是一个数字> 32成功,当函数失败时,不能用作错误代码以外的任何内容。另一方面,如果您将SEE_MASK_NOCLOSEPROCESS传递给Ex版本,则需要关闭一个句柄。

答案 2 :(得分:0)

我清楚一点HINSTANCEHMODULE。这不是HANDLE,而是作为内存地址(指针)。如果您只是将hInstance转换为(IMAGE_DOS_HEADER *)并查看已加载模块的内部,则可以理解这一点。您可以使用VirtualQueryEx (GetCurrentProcess(),...)从内存地址接收更多信息(例如大小)。

查看http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspxhttp://www.apriorit.com/our-experience/articles/9-sd-articles/74-hmodule-hinstance-handle-from-static-library-in-c,您将看到如何从内存地址(__ ImageBase)接收HINSTANCE

因此,如果你以LoadLibrary为例,则会收到HMODULE(与HINSTANCE相同)。您应该使用FreeLibrary不要“关闭句柄”,而是从内存中卸载模块。例如,如果您使用GetModuleHandle,则会收到相同的地址(您收到的地址为HMODULE),但您不应该致电FreeLibrary来“关闭句柄”。

如果您了解HINSTANCEHMODULE是什么以及如何使用它们,您将会知道如何使用从HINSTANCE返回的ShellExecute