Information : Appel des routines de sortie CRT à partir d'une application GUI

Traductions disponibles Traductions disponibles
Numéro d'article: 105305 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Résumé

Pour utiliser les routines de sortie C Run-time, comme printf(), à partir d'une application GUI, il est nécessaire créer une console. L'interface de programmation d'application Win32 (API) AllocConsole() crée la console. Le setvbuf() routine CRT supprime la mise en mémoire tampon de sorte que la sortie est immédiatement visible.

Cette méthode fonctionne si l'application de la GUI est exécutée à partir de la ligne de commande ou à partir du Gestionnaire de fichiers. Toutefois, cette méthode ne fonctionne pas si l'application est démarrée à partir du Gestionnaire de programme ou via la commande «start». Le code suivant montre comment faire pour contourner ce problème :
   int hCrt;
   FILE *hf;

   AllocConsole();
   hCrt = _open_osfhandle(
             (long) GetStdHandle(STD_OUTPUT_HANDLE),
             _O_TEXT
          );
   hf = _fdopen( hCrt, "w" );
   *stdout = *hf;
   i = setvbuf( stdout, NULL, _IONBF, 0 );
				
ce code s'ouvre une nouvelle poignée CRT de bas niveau pour le descripteur de sortie de console correct, associe un nouveau flux de ce handle de bas niveau et remplace stdout avec ce nouveau flux. Ce processus prend en charge les fonctions qui utilisent stdout, comme printf(), puts() et ainsi de suite. Utilisez la même procédure pour stdin et stderr.

Notez que ce code ne corrige pas les problèmes avec des poignées de 0, 1 et 2. En fait, en raison d'autres complications, il n'est pas possible de corriger ce problème, et par conséquent, il est nécessaire d'utiliser des flux d'e/S au lieu d'e/S de bas niveau.

Plus d'informations

Lorsqu'une application GUI est démarrée avec la «start «commande, le système d'exploitation standard trois gère STD_INPUT_HANDLE STD_OUTPUT_HANDLE et STD_ERROR_HANDLE sont tous» mis à zéro» par les routines d'initialisation de console. Ces trois poignées sont remplacées par les valeurs valides lorsque l'application de la GUI appelle AllocConsole(). Par conséquent, une fois cette opération effectuée, l'appel de GetStdHandle() retournera toujours les valeurs de handle valide. Le problème est que le CRT a déjà terminé l'initialisation avant votre application obtient une chance d'appeler AllocConsole() ; les trois faibles poignées d'e/S 0, 1 et 2 ont déjà été configurées pour utiliser l'original mis à zéro handles de système d'exploitation, afin que toutes les e/S CRT est envoyé vers les handles de système d'exploitation non valides et de sortie CRT n'apparaît pas dans la console. Utilisez la solution de contournement décrite ci-dessus pour éliminer ce problème.

Dans le cas de démarrage de l'application graphique à partir de la ligne de commande sans la commande «start», les poignées du système d'exploitation standard sont originel pas correctement annulé, mais sont incorrectement héritées de cmd.exe. Lorsque l'application CRT initialise, les poignées d'e/S trois faibles 0, 1 et 2 sont initialisées à utiliser les numéros de trois handle cmd.exe hérite de l'application. Lorsque l'application appelle AllocConsole(), les routines d'initialisation console tentent de remplacer ce que l'initialisation de la console pense pour être des valeurs de handle de système d'exploitation standard non valides avec les valeurs de handle valide à partir de la nouvelle console. Par coïncidence, car les routines d'initialisation de console ont tendance à donner les mêmes valeurs de trois pour les handles de système d'exploitation standard, l'initialisation de la console remplacera les valeurs de handle de système d'exploitation standard avec les mêmes valeurs présents avant--celles héritées de cmd.exe. Par conséquent, E/S CRT fonctionne dans ce cas.

Il est important de comprendre que la possibilité d'utiliser les routines de CRT à partir d'une application GUI exécuter à partir de la ligne de commande n'était en conception pas et cela peut ne pas fonctionner dans les futures versions de Windows NT ou Windows. Dans une version ultérieure, il se peut que vous ayez la solution de contournement pas seulement pour les applications démarrées sur la ligne de commande avec «start < nom_application >», mais également pour les applications démarrées sur la ligne de commande avec «nom de l'application».

Propriétés

Numéro d'article: 105305 - Dernière mise à jour: mardi 21 novembre 2006 - Version: 4.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Win32 Application Programming Interface sur le système suivant
    • Microsoft Windows NT Advanced Server 3.1
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows Millennium Edition
    • the operating system: Microsoft Windows XP
Mots-clés : 
kbmt kbconsole kbinfo kbkernbase KB105305 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 105305
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com