成功时,ShellExecute返回一个句柄。
我们需要关闭这个句柄,如果是这样,怎么样?
根据Microsoft发布的示例,我们需要 not 关闭此句柄。但ShellExecute本身的文档在这个主题上是静音的。你能否证实我们确实不需要关闭这个句柄?
但是,如何处理有效并且不需要关闭???以下哪一项陈述是正确的:
答案 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)
我清楚一点HINSTANCE
和HMODULE
。这不是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-hmodule-hinstance-handle-from-static-library-in-c,您将看到如何从内存地址(__ ImageBase)接收HINSTANCE
。
因此,如果你以LoadLibrary
为例,则会收到HMODULE
(与HINSTANCE
相同)。您应该使用FreeLibrary
不要“关闭句柄”,而是从内存中卸载模块。例如,如果您使用GetModuleHandle
,则会收到相同的地址(您收到的地址为HMODULE
),但您不应该致电FreeLibrary
来“关闭句柄”。
如果您了解HINSTANCE
和HMODULE
是什么以及如何使用它们,您将会知道如何使用从HINSTANCE
返回的ShellExecute
。