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