5

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

我们是否需要关闭此句柄,如果需要,如何关闭?

根据我的微软发布的例子,我们不需要关闭这个句柄。但是 ShellExecute 本身的文档在这个问题上是沉默的。你能确认我们确实不需要关闭这个句柄吗?

但是,一个句柄怎么可能是有效的并且不需要被关闭???以下哪项陈述是/是正确的:

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

3 回答 3

5

那个hinstance是一个16位的东西,在win32中,它只是一个成功的> 32的数字,除了函数失败时的错误代码外,不能用于任何其他用途。另一方面,如果您将 SEE_MASK_NOCLOSEPROCESS 传递给 Ex 版本,则您需要关闭一个句柄。

于 2010-05-06T10:51:08.307 回答
4

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

如果函数成功,则返回大于 32 的值。如果函数失败,则返回指示失败原因的错误值。为了向后兼容 16 位 Windows 应用程序,返回值被转换为 HINSTANCE。但是,这不是真正的 HINSTANCE。它只能转换为 int 并与 32 或以下错误代码进行比较。

于 2010-05-06T10:49:44.843 回答
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,您将看到如何HINSTANCE从内存地址 (__ImageBase) 接收 a。

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

如果您了解它们是什么HINSTANCE以及HMODULE应该如何使用它们,您将知道如何使用HINSTANCEShellExecute.

于 2010-05-13T10:53:34.407 回答