Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

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

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
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».
3.10 3,50 CRT rediriger poignées std

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 105305 - Dernière mise à jour : 11/21/2006 15:41:01 - Révision : 4.2

Microsoft Win32 Application Programming Interface

  • kbmt kbconsole kbinfo kbkernbase KB105305 KbMtfr
Commentaires