ShelLEXECETEEX com See_Mask_FLAG_NO_UI Exibe erro ao iniciar o aplicativo .NET no sistema sem .NET

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

  •  22-09-2019
  •  | 
  •  

Pergunta

o ShellExecuteEx Chamada de função win32 tem uma bandeira SEE_MASK_FLAG_NO_UI em seu SHELLEXECUTEINFO estrutura, que deve suprimir qualquer caixa de diálogo de erro que possa ser exibido devido a um erro ao iniciar um aplicativo.

A documentação do MSDN aqui é bastante explícito sobre isso:

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

No meu caso, estou lançando um .NET executável em um sistema Windows XP, onde não está instalado .NET. Recebo sistematicamente a seguinte mensagem, exibida pelo Windows em uma janela de diálogo:

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

Não quero que o usuário tenha que lidar com esta mensagem. Prefiro recuperar um código de erro de ShellExecuteEx e ser capaz de lidar com isso graciosamente no meu programa. Aqui está o trecho de código que estou usando para iniciar o executável externo:

#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);
}

Existe uma maneira oficial de suprimir a mensagem de erro se .NET não estiver presente no sistema? Ou tenho que verificar essa condição específica antes de executar o aplicativo (mas não sei com antecedência se for um aplicativo .NET ou um aplicativo nativo). E se o aplicativo que estou começando estiver perdendo algumas DLLs, por exemplo?

Foi útil?

Solução

O sinalizador diz apenas ao shell para não exibir uma mensagem de erro. Não afeta a interface do usuário do processo que começou. O .NET .EXE realmente começou, então o ShellexEcteex () fez seu trabalho e não viu erros. O fato de decidir bombardear depois e informar o usuário a saber não é algo que você possa corrigir facilmente.

Outras dicas

Por que você não usa o CreateProcess função

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top