如果选择mspaint作为图像的默认应用程序,则执行以下代码将出错。
将图像的默认应用程序设置为任何其他应用程序,例如“照片”,将使用所选应用程序打开图像,不会出现错误。
使用
ShExecInfo.lpVerb = L"edit"
将使用 mspaint 打开图像,不会出现错误。
该问题从 Windows 10 开始出现。
#include <shlwapi.h>
int main()
{
SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = L"open"; //L"edit"
ShExecInfo.lpFile = L"C:/test.jpg";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_MAXIMIZE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
return 0;
}
这是一个已知的 Microsoft 错误吗?
这有效:
SHELLEXECUTEINFOW ShExecInfo = {};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
ShExecInfo.lpVerb = L"edit";
ShExecInfo.lpFile = L"C:/test.jpg";
ShExecInfo.nShow = SW_MAXIMIZE;
ShExecInfo.fMask = SEE_MASK_NOASYNC;
if (!ShellExecuteExW(&ShExecInfo))
{
// Error reported in GetLastError()
在本例中没有与 JPEG 相关的
open
动词。将 lpVerb
保留为空或将其设置为 edit
。
您需要使用
SEE_MASK_NOASYNC
,因为您的示例没有 Win32 消息循环。
您可能还想添加
以避免出现错误时出现该消息框,以便您的程序可以处理它们。SEE_MASK_FLAG_NO_UI
根据代码的用途,您可以选择指定要打开的工具的选项,这将避免出现此错误消息。 (刚刚在 Windows 11 上测试)。假设您的图像文件是
filePath
并且定义为 std::wstring
。
HINSTANCE result = ShellExecute(
nullptr, // Parent window
L"open", // Operation to perform
L"mspaint", // Application to open
filePath.c_str(), // Additional parameters (file path)
nullptr, // Default directory
SW_SHOWNORMAL // Show window normally
);