ShellExecuteEx с SEE_MASK_FLAG_NO_UI отображает ошибку при запуске приложения .NET в системе без .NET
-
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() выполнила свою работу и не обнаружила ошибок.То, что после этого он решил взорвать систему и сообщить об этом пользователю, нелегко исправить.
Другие советы
почему бы тебе не использовать Создатьпроцесс функция