【问题标题】:how come we need not close the handle returned by ShellExecute?为什么我们不需要关闭 ShellExecute 返回的句柄?
【发布时间】:2010-05-06 10:41:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: winapi shellexecute


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 看起来我还没有阅读微软文档中的所有细则 ;-) 答案就在我的眼前,但没有进入我的脑海......
      【解决方案3】:

      我有点清楚什么是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 以及它们应该如何使用,您将知道如何使用从ShellExecute 返回的HINSTANCE

      【讨论】:

      • 你没有回答这个问题......正如其他答案告诉我的那样,从 ShellExecute 返回的值不是一个真正的句柄,所以知道真正的句柄如何工作对我没有帮助!此外,你错了,AFAIK。 FreeLibrary 只关闭一个句柄(即,我猜,减少对象的引用计数或类似的东西)。只有当所有句柄都关闭时,对象本身(这里是 DLL)才会被释放。 GetModuleHandle 返回句柄而不增加引用计数,这就是为什么通常不应在该句柄上调用 FreeLibrary 的原因。 (参见 GetModuleHandle 的文档)
      • 你不应该“关闭”HINSTANCE。它不是 Windows 句柄(请参阅任务管理器列句柄)。 ShellExecute 是 CreateProcess 的包装器,它不给你返回任何 hProcces 句柄。它为你关闭它。如果您有兴趣了解 ShellExecute 的大致实现情况,请参阅 ReactOS 项目中的svn.reactos.org/svn/reactos/branches/reactx/reactos/dll/win32/…。 DLL (HMODULE) 的引用计数器具有句柄的另一种性质。尝试为 HINSTANCE 找到一个“关闭”的 API(如 CloseHandle)。根本没有这样的API!!!
      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2013-05-19
      • 2021-08-23
      相关资源
      最近更新 更多