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.
-
看起来我还没有阅读Microsoft文档中的所有精美文章;-)答案就在我的眼中,但没引起我的注意...
我弄清楚什么是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-从c的静态库中获取hmodule-hinstance-handle,您将看到如何从内存地址(__ImageBase)接收HINSTANCE。
因此,例如,如果您LoadLibrary,您会收到一个HMODULE(与HINSTANCE相同)。您不应该使用FreeLibrary来"关闭句柄",而是从内存中卸载模块。例如,如果使用GetModuleHandle,则会收到相同的地址(您收到的地址强制转换为HMODULE),但是您不应调用FreeLibrary来"关闭句柄"。
如果您了解什么是HINSTANCE和HMODULE以及应如何使用它们,您将知道如何使用从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/win3 2 /。 DLL(HMODULE)的引用计数器具有另一种性质作为句柄。尝试找到用于HINSTANCE的"关闭" API(例如CloseHandle)。根本没有这样的API !!!