ShellExecuteEx 无法打开图像,而 mspaint 是 Windows 10 以来的默认应用程序

问题描述 投票:0回答:2

如果选择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;
}

enter image description here

这是一个已知的 Microsoft 错误吗?

c++ windows-10
2个回答
0
投票

这有效:

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
以避免出现错误时出现该消息框,以便您的程序可以处理它们。


0
投票

根据代码的用途,您可以选择指定要打开的工具的选项,这将避免出现此错误消息。 (刚刚在 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
    );
© www.soinside.com 2019 - 2024. All rights reserved.