2010-01-21 21 views
1

L'appel de fonction Win32 ShellExecuteEx a un drapeau SEE_MASK_FLAG_NO_UI 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 .ShellExecuteEx avec SEE_MASK_FLAG_NO_UI affiche une erreur lors du démarrage de l'application .NET sur le système sans .NET

La documentation MSDN here 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 récupérer un code d'erreur de ShellExecuteEx et être capable de le gérer avec élégance 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 moi-même cette condition spécifique avant d'exécuter l'application (mais je ne sais pas à l'avance s'il s'agit d'une application .NET ou d'une application native). Et si l'application que je commence manque certaines DLL, par exemple?

Répondre

4

Le drapeau indique que le shell de ne pas afficher un message d'erreur. Cela n'affecte pas l'interface utilisateur du processus démarré. Le fichier .NET .exe a vraiment démarré alors ShellExecuteEx() a fait son travail et n'a vu aucune erreur. Qu'il a décidé de bombarder après et de le faire savoir à l'utilisateur n'est pas quelque chose que vous pouvez facilement corriger.

+0

Vous avez complètement raison. Et la seule façon de contourner ce problème est de détecter qu'il n'y a pas de .NET et d'éviter de démarrer l'application complètement. –

0

pourquoi ne pas utiliser la fonction CreateProcess

+0

Merci Remus pour votre suggestion. Je n'utilise pas CreateProcess, car il affiche également la boîte de dialogue d'erreur. J'espérais que l'option SEE_MASK_FLAG_NO_UI aiderait, en quelque sorte. –