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

how come we need not close the handle returned by ShellExecute?

成功执行后,ShellExecute将返回一个句柄。

我们需要关闭此手柄吗?

根据我的Microsoft发布的示例,我们不需要关闭此句柄。 但是ShellExecute本身的文档在该主题上是静音的。 您可以确认我们确实不需要关闭此手柄吗?

但是,然后一个句柄如何有效而又不需要关闭呢? 以下哪个陈述是正确的:

  • 手柄无效,我们无法对其进行任何操作;
  • 该句柄永远不会释放,并且存在(Microsoft赞助)内存泄漏(直到调用者程序结束);
  • 该句柄会在某个时候由系统自动释放,此后再也不会再使用(->另一种资源泄漏)。 只有尝试使用它,我们才能知道它是否仍然指向某些东西。
  • 还有什么 ?

  • 提示是16位的事情,在win32中,成功仅是一个数字> 32,并且不能用作函数失败时的错误代码。另一方面,如果将SEE_MASK_NOCLOSEPROCESS传递给Ex版本,则需要关闭手柄。


    摘自:http://msdn.microsoft.com/zh-cn/library/bb762153%28VS.85%29.aspx

    If the function succeeds, it returns a
    value greater than 32. If the function
    fails, it returns an error value that
    indicates the cause of the failure.
    The return value is cast as an
    HINSTANCE for backward compatibility
    with 16-bit Windows applications. It
    is not a true HINSTANCE, however. It
    can be cast only to an int and
    compared to either 32 or the following
    error codes below.


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

    看看http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx和http://www.apriorit.com/our-experience/articles/9-sd-articles/74-从c的静态库中获取hmodule-hinstance-handle,您将看到如何从内存地址(__ImageBase)接收HINSTANCE

    因此,例如,如果您LoadLibrary,您会收到一个HMODULE(与HINSTANCE相同)。您不应该使用FreeLibrary来"关闭句柄",而是从内存中卸载模块。例如,如果使用GetModuleHandle,则会收到相同的地址(您收到的地址强制转换为HMODULE),但是您不应调用FreeLibrary来"关闭句柄"。

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