首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有默认图像/照片查看器的windows 7上的ShellExecuteEx

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

Stack Overflow用户
提问于 2013-03-19 20:48:14
回答 1查看 1.1K关注 0票数 4

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

在我们的源代码中,我们使用open调用ShellExecuteEx

在此之后-为了等待被调用的programm的终止-我们用infinite调用WaitForSingleObject

它的工作没有问题,只有在windows-7机器上有图像和默认的图像查看器,我们有问题。

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

这不会发生在Windows7上,当有另一个图像查看器时,例如,Picasa照片查看器,或Evince版本或JPEGView。

我不知道Windows7和ShellExecuteEx上的默认图像查看器的问题出在哪里。ShellExecuteEx没有返回错误码!

提前谢谢你。

更新:感谢您的回答。

@大卫·赫弗南:正如你所说,在它不起作用的情况下,ShellExecuteEx的返回代码(hInstApp)为42 (ok!)并且hProcess为空!(启动的唯一新进程是dllhost.exe。)

但是,我在另一台windows7机器上测试了整个系统。在本例中,我执行了以下操作:

在这台机器上的

  • Picasa是默认的查看器。
  • 我切换回默认的(Windows照片查看器)。
  • 它工作!
  • 然后我没有关闭照片查看器,并再次按下“显示”在我们的应用程序中。-它也可以工作(弹出一个新的查看器实例),即使Windows照片查看器已经在运行!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-19 21:09:03

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

SHELLEXECUTEINFO的文档涵盖了以下内容:

即使fMask设置为SEE_MASK_NOCLOSEPROCESS,如果未启动任何进程,hProcess也将为NULL。例如,如果要启动的文档是一个URL,并且Internet Explorer的一个实例已经在运行,则它将显示该文档。不会启动任何新进程,hProcess将为空。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15499954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档