gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:09:42 26 4
gpt4 key购买 nike

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

在我们的源代码中,我们调用 ShellExecuteExopen .
在此之后——为了等待被调用程序的终止——我们调用 WaitForSingleObjectinfinite .

它可以正常工作,仅在带有图像的 windows-7 机器和默认图像查看器上我们有问题。

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

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

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

提前非常感谢。

更新:
谢谢您的回答。

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

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

最佳答案

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

SHELLEXECUTEINFO 的文档涵盖了这个:

Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.



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

关于winapi - 带有默认图像/照片查看器的 Windows 7 上的 ShellExecuteEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15499954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com