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