我们有一个在Windows XP,Windows Vista,Windows 7等上运行的桌面应用程序(它用cobol编写,但我认为在这种情况下它不相关)。
在我们的源代码中,我们使用ShellExecuteEx
调用open
在此之后 - 为了等待被叫程序的终止 - 我们使用WaitForSingleObject
调用infinite
。
它没有问题,只在带有图像的Windows-7机器和我们遇到问题的默认图像查看器上。
如果为{jpg或tif文件调用ShellExecuteEx
并且机器只有默认的Windows图像/照片查看器,则会发生错误。 WaitForSingeObject
返回WAIT_FAILED
,GetLastError()
说: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已经运行,它也可以工作(弹出查看器的新实例)!
答案 0 :(得分:5)
现代Windows版本中图像上open
动词的默认处理程序可能无法调用新进程。它可能只是在已经运行的shell进程中显示图像。当发生这种情况时,返回的进程句柄为NULL
。这就是这里发生的事情,这就是对WaitForSingleObject
的调用以你描述的方式失败的原因。
SHELLEXECUTEINFO
的文档涵盖了这一点:
即使fMask设置为SEE_MASK_NOCLOSEPROCESS,如果没有启动进程,hProcess也将为NULL。例如,如果要启动的文档是URL并且Internet Explorer的实例已在运行,则它将显示该文档。没有启动新进程,并且hProcess将为NULL。
这一切意味着你的程序部分的设计是基于一个有缺陷的假设。即假设调用ShellExecuteEx
将始终产生一个进程句柄,您可以等待终止。您需要找到其他方法来解决您的问题。