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

Wol*_*mec 4 winapi windows-7

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

在我们的源代码我们称之为ShellExecuteExopen.
在此之后 - 为了等待被叫程序的终止 - 我们打电话WaitForSingleObjectinfinite.

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

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

当有另一个图像查看器时,例如,Picasa Photo Viewer或Evince windows版本或JPEGView,这不会在Windows 7上发生.

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

非常感谢提前.

更新:感谢您的回答.

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

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

Dav*_*nan 5

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

文档SHELLEXECUTEINFO涵盖了这个:

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

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