ShellExecuteEx с SEE_MASK_FLAG_NO_UI отображает ошибку при запуске приложения .NET в системе без .NET - PullRequest
2 голосов
/ 21 января 2010

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

Документация 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 ]

4 голосов
/ 21 января 2010

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

0 голосов
/ 21 января 2010

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

...