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

StackOverflow https://stackoverflow.com/questions/2108159

  •  22-09-2019
  •  | 
  •  

Вопрос

А 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?

Это было полезно?

Решение

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

Другие советы

почему бы тебе не использовать Создатьпроцесс функция

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top