ShellExecuteEx с SEE_MASK_FLAG_NO_UI отображает ошибку при запуске приложения.NET в системе без.NET

ShellExecuteEx Вызов функции Win32 имеет флаг SEE_MASK_FLAG_NO_UI в его SHELLEXECUTEINFO структура, которая должна подавлять любые сообщения об ошибках, которые могут отображаться из-за ошибки при запуске приложения.

Документация MSDN здесь довольно явно об этом:

SEE_MASK_FLAG_NO_UI
  0x00000400. Do not display an error message box if an error occurs.

В моем случае я запускаю исполняемый файл.NET в системе Windows XP, где не установлен.NET. Я систематически получаю следующее сообщение, отображаемое Windows в диалоговом окне:

Xxx.exe - Application Error
The application failed to initialize properly (0xc0000135).
Click on OK to terminate the application.
[ OK ]

Я не хочу, чтобы пользователь имел дело с этим сообщением. Я бы предпочел вернуть код ошибки от ShellExecuteEx и быть в состоянии справиться с этим изящно в моей программе. Вот фрагмент кода, который я использую для запуска внешнего исполняемого файла:

#include <windows.h>

int wmain(int argc, wchar_t* argv[])
{
    SHELLEXECUTEINFO info;
    memset(&info, 0, sizeof(SHELLEXECUTEINFO));
    info.cbSize = sizeof(SHELLEXECUTEINFO);
    info.fMask = SEE_MASK_FLAG_NO_UI;
    info.lpVerb = L"open";
    info.lpFile = L"Xxx.exe";
    info.nShow  = SW_SHOW;
    return ShellExecuteEx (&info);
}

Существует ли официальный способ подавления сообщения об ошибке, если в системе отсутствует.NET? Или я должен сам проверить это конкретное условие перед выполнением приложения (но я заранее не знаю, является ли это.NET-приложением или нативным приложением). А что, если в приложении, которое я запускаю, отсутствуют некоторые библиотеки DLL, например?

2 ответа

Решение

Флаг только говорит оболочке не отображать сообщение об ошибке. Это не влияет на пользовательский интерфейс начавшегося процесса..NET .exe действительно начал работу, поэтому ShellExecuteEx() выполнила свою работу и не увидела ошибок. То, что он решил после этого взорвать бомбу и сообщить пользователю об этом, не легко исправить.

Почему вы не используете функцию CreateProcess

Другие вопросы по тегам