翻译《The Old New Thing》 - What can I do with the HINSTANCE returned by the ShellExecute function?

What can I do with the HINSTANCE returned by the ShellExecute function? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20060505-08/?p=31293

Raymond Chen 2006年05月05日

 


如何处理 ShellExecute 函数返回的 HINSTANCE?

        在16位Windows中,HINSTANCE用于标识一个程序。Win32内核是16位内核的完全重新设计,引入了诸如“内核对象”和“安全描述符”等概念。特别是,16位Windows没有“进程ID”;实例句柄就起到了这个作用。这就是为什么WinExecShellExecute函数返回一个HINSTANCE的原因。但在32位世界中,HINSTANCE并不唯一地标识一个正在运行的程序,因为它仅仅是可执行文件的基地址。由于每个程序都在自己的地址空间中运行,因此该值在整个系统中几乎不是唯一的。

        那么,你可以用ShellExecute函数返回的HINSTANCE做什么呢?你可以检查它是否大于32,这表明调用成功。如果值小于32,则它是一个错误代码。在大于32的情况下,HINSTANCE的确切值是没有意义的。

        我为什么要告诉你这些在MSDN上已经提到了的事情?因为人大家很难将其关联起来。我一直看到有人拿到ShellExecute函数返回的HINSTANCE,然后在系统中搜索所有窗口,寻找具有匹配GWLP_HINSTANCE(或者如果你仍然生活在非64位兼容的世界中,是GWL_HINSTANCE)的窗口。这是徒劳的,原因有两个。首先,你得到的HINSTANCE的值是没有意义的,即使它有意义,对你也没用,因为HINSTANCE不是唯一的。(实际上,一个进程的HINSTANCE几乎总是0x00400000,因为这是大多数链接器分配给程序可执行文件的默认地址。)

        人们想要进行这种操作的最常见原因是他们想要对刚刚启动的程序做一些事情,通常是等待它退出,这表明用户已经关闭了文档,但这是有问题的。

        首先,正如我们所注意到的,你从ShellExecute函数得到的HINSTANCE是无用的。你必须使用ShellExecuteEx函数,并在SHELLEXECUTEINFO结构体中设置SEE_MASK_NOCLOSEPROCESS标志,此时会在hProcess成员中返回一个进程句柄。但这仍然不起作用。

        一个文档可以被执行而不创建新进程。你会遇到这种情况的最常见情况(但几乎不是唯一的)是,如果注册的文档类型处理程序请求了一个DDE(动态数据交换)对话。在这种情况下,程序的一个现有实例已经接受了对文档的责任。等待进程退出与等待用户关闭文档不是同一回事,因为关闭文档并不退出进程。

        仅仅因为用户关闭了文档,并不意味着进程就退出了。大多数程序允许你从“文件”菜单中打开一个新文档。一旦打开了新文档,用户就可以关闭旧的文档。(单文档程序在打开新文档时隐式地关闭旧文档。)此外,关闭与文档相关的所有打开窗口并不一定导致程序退出。有些程序即使在关闭了所有窗口之后也会在后台运行,要么是为了提供某种持续的服务,要么是因为它们只是预计用户很快会再次运行程序,所以它们会延迟最终退出几分钟,看看是否还会被需要。

        进程退出了,并不意味着文档就关闭了。有些程序会检测到先前的实例,并将文档传递给该实例。其他程序是启动另一个进程来完成实际工作的存根。在这两种情况下,新创建的进程很快就退出了,但文档仍然打开,因为文档的责任已经转移给了另一个进程。

        没有统一的方法来检测文档是否已被关闭。每个程序都以不同的方式处理它。如果你很幸运,程序会暴露出允许你监视打开文档状态的属性。正如我们前面看到的,Internet Explorer通过ShellWindows对象公开了其打开窗口的属性。我了解到,Microsoft Office也为其组件程序公开了一个相当复杂的自动化接口集。


  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x0007

可不可奖励我吃只毛嘴鸡 馋😋

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值