带有默认图像/照片查看器的Windows 7上的ShellExecuteEx

时间:2013-03-19 12:48:14

标签: winapi windows-7

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

在我们的源代码中,我们使用ShellExecuteEx调用open 在此之后 - 为了等待被叫程序的终止 - 我们使用WaitForSingleObject调用infinite

它没有问题,只在带有图像的Windows-7机器和我们遇到问题的默认图像查看器上。

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

如果有其他图像查看器,例如Picasa Photo Viewer或Evince windows版本或JPEGView,则不会在Windows 7上发生这种情况。

我不知道Windows 7和ShellExecuteEx上的默认图像查看器出了什么问题。 ShellExecuteEx不会返回错误代码!

提前多多谢谢。

更新: 谢谢你的回答。

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

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

1 个答案:

答案 0 :(得分:5)

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

SHELLEXECUTEINFO的文档涵盖了这一点:

  

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

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