我们有一个桌面应用程序运行在Windows XP、Windows Vista、Windows 7等等上(它是用cobol编写的,但我认为在这种情况下它是不相关的)。
在我们的源代码中,我们使用open调用ShellExecuteEx。
在此之后-为了等待被调用的programm的终止-我们用infinite调用WaitForSingleObject。
它的工作没有问题,只有在windows-7机器上有图像和默认的图像查看器,我们有问题。
如果在那里为jpg或tif文件调用ShellExecuteEx,而机器只有默认的windows图像/照片查看器,则会发生错误。WaitForSingeObject返回WAIT_FAILED,GetLastError()说:INVALID_HANDLE。
这不会发生在Windows7上,当有另一个图像查看器时,例如,Picasa照片查看器,或Evince版本或JPEGView。
我不知道Windows7和ShellExecuteEx上的默认图像查看器的问题出在哪里。ShellExecuteEx没有返回错误码!
提前谢谢你。
更新:感谢您的回答。
@大卫·赫弗南:正如你所说,在它不起作用的情况下,ShellExecuteEx的返回代码(hInstApp)为42 (ok!)并且hProcess为空!(启动的唯一新进程是dllhost.exe。)
但是,我在另一台windows7机器上测试了整个系统。在本例中,我执行了以下操作:
在这台机器上的
发布于 2013-03-19 21:09:03
在现代Windows版本中,图像上的open谓词的默认处理程序可能不会调用新进程。它很可能只是在已经运行的shell进程中显示图像。当发生这种情况时,返回的进程句柄为NULL。这就是这里正在发生的事情,这就是对WaitForSingleObject的调用以您所描述的方式失败的原因。
SHELLEXECUTEINFO的文档涵盖了以下内容:
即使fMask设置为SEE_MASK_NOCLOSEPROCESS,如果未启动任何进程,hProcess也将为NULL。例如,如果要启动的文档是一个URL,并且Internet Explorer的一个实例已经在运行,则它将显示该文档。不会启动任何新进程,hProcess将为空。
这一切都意味着,程序的这一部分的设计是基于一个有缺陷的假设。也就是说,假设调用ShellExecuteEx将始终生成一个进程句柄,您可以在该句柄上等待终止。你需要找到其他方法来解决你的问题。
https://stackoverflow.com/questions/15499954
复制相似问题