ShellExecuteEx avec SEE_MASK_FLAG_NO_UI affiche une erreur lors du démarrage de l'application .NET sur le système sans .NET

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

  •  22-09-2019
  •  | 
  •  

Question

Le ShellExecuteEx appel de fonction Win32 a un SEE_MASK_FLAG_NO_UI de drapeau dans sa structure SHELLEXECUTEINFO, qui devrait supprimer les boîtes de dialogue d'erreur qui pourraient être affichés en raison d'une erreur lors du lancement d'une application.

La documentation MSDN est tout à fait explicite à ce sujet:

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

Dans mon cas, je lance un exécutable .NET sur un système Windows XP où aucun .NET est installé. Je reçois systématiquement le message suivant, affiché par Windows dans une fenêtre de dialogue:

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

Je ne veux pas que l'utilisateur d'avoir à faire face à ce message. Je préfère recevoir un code d'erreur de ShellExecuteEx et être capable de le traiter gracieusement dans mon programme. Voici l'extrait de code que j'utilise pour lancer l'exécutable externe:

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

est-il un moyen officiel de supprimer le message d'erreur si .NET n'est pas présent sur le système? Ou dois-je vérifier cette condition spécifique moi-même avant d'exécuter l'application (mais je ne sais pas à l'avance si elle est une application .NET ou une application native). Et si l'application je commence manque des DLL, par exemple?

Était-ce utile?

La solution

Le drapeau indique que le shell de ne pas afficher un message d'erreur. Il ne modifie pas l'interface utilisateur du processus qui a commencé. Le .exe .NET vraiment ne commencer si ShellExecuteEx () a fait son travail et a vu aucune erreur. Qu'il a décidé de bombarder la suite et de laisser l'utilisateur de savoir à ce sujet n'est pas quelque chose que vous pouvez facilement corriger.

Autres conseils

pourquoi ne pas utiliser le CreateProcess fonction

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top