2013-03-19 38 views
4

我们有一个桌面应用程序运行在Windows XP,Windows Vista,Windows 7等(它是用cobol编写的,但我认为在这种情况下它是不相关的)。Windows 7上的ShellExecuteEx与默认图像/照片查看器

在我们的源代码中,我们调用ShellExecuteExopen
之后 - 为了等待被叫程序终止 - 我们将WaitForSingleObjectinfinite联系起来。

这是工作没有问题,只有在windows-7-machines与图像和默认图像查看器我们有问题。

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

当Windows 7上有其他图像查看器(例如Picasa照片查看器或Evince windows版本或JPEGView)时,不会发生这种情况。

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

非常感谢提前。

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

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

+0

你确定ShellExecuteEx没有返回错误吗?即使按照Windows API的标准,它的错误处理也是不透明的 - 最终必须将结构的hInstApp成员转换为int并将其与32进行比较。它存储在结构的hInstApp成员中的值是什么失败的情况? – DavidK 2013-03-19 12:57:34

+0

你在等什么?你能告诉我们那个代码吗? – Deanna 2013-03-19 14:29:07

+0

@DavidK你很困惑。你正在考虑'ShellExecute'。实际上'ShellExecuteEx'的体面错误报告。 – 2013-03-19 14:47:55

回答

5

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

SHELLEXECUTEINFO的文档涵盖这样的:

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

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

相关问题