4

我们有一个在 Windows XP、Windows Vista、Windows 7 等上运行的桌面应用程序(它是用 cobol 编写的,但我认为在这种情况下它是不相关的)。

在我们的源代码中,我们ShellExecuteEx使用open.
在这之后——为了等待被调用程序的终止——我们WaitForSingleObjectinfinite.

它可以正常工作,仅在带有图像的 windows-7 机器和默认图像查看器上我们有问题。

如果ShellExecuteEx在那里调用 jpg 或 tif 文件并且机器只有默认的 windows 图像/照片查看器,则会发生错误。WaitForSingeObject返回WAIT_FAILEDGetLastError()说:INVALID_HANDLE

当有另一个图像查看器(例如 Picasa 照片查看器、Evince windows 版本或 JPEGView)时,这不会在 Windows 7 上发生。

我不知道 Windows 7 和ShellExecuteEx. ShellExecuteEx不返回错误代码!

提前非常感谢。

更新:感谢您的回答。

@David Heffernan:正如你所说,在它不起作用的情况下,ShellExecuteEx 的返回码(hInstApp)为 42(好的!)并且 hProcess 为 NULL!(唯一启动的新进程是 dllhost.exe。)

但是,我在另一台 Windows 7 机器上测试了整个东西。在这种情况下,我做了以下事情:
- 在这台机器上,Picasa 是默认查看器。
- 我切换回默认设置(Windows 照片查看器)。
- 有效!
- 然后我没有关闭照片查看器并在我们的应用程序中再次按下“显示”。- 它也可以工作(弹出一个新的查看器实例),即使 Windows 照片查看器已经在运行!

4

1 回答 1

5

现代 Windows 版本中图像上动词的默认处理程序open可能不会调用新进程。它很可能只是在已经运行的 shell 进程中显示图像。发生这种情况时,返回的进程句柄是NULL. 这就是这里发生的事情,这就是为什么调用以WaitForSingleObject您描述的方式失败的原因。

的文档SHELLEXECUTEINFO涵盖了这一点:

即使 fMask 设置为 SEE_MASK_NOCLOSEPROCESS,如果没有启动进程,hProcess 也会为 NULL。例如,如果要启动的文档是 URL,并且 Internet Explorer 的实例已经在运行,它将显示该文档。没有启动新进程,并且 hProcess 将为 NULL。

这一切意味着你程序的那部分的设计是基于一个有缺陷的假设。即假设调用ShellExecuteEx将始终产生一个您可以等待终止的进程句柄。您将需要找到其他方法来解决您的问题。

于 2013-03-19T13:09:03.060 回答