Partager via


Handles de console

Un processus de console utilise des handles pour accéder à la mémoire tampon d’entrée et à la mémoire tampon d’écran de sa console. Un processus peut utiliser la fonction GetStdHandle, CreateFile ou CreateConsoleScreenBuffer pour ouvrir l’un de ces handles.

La fonction GetStdHandle fournit un mécanisme permettant de récupérer les handles d’entrée standard (STDIN), de sortie standard (STDOUT) et d’erreur standard (STDERR) qui sont associés à un processus. Ces handles sont créés par le système pendant la création de la console. À la base, STDIN est un handle vers la mémoire tampon d’entrée de la console, et STDOUT et STDERR sont des handles vers la mémoire tampon d’écran active de la console. Toutefois, la fonction SetStdHandle peut rediriger les handles standard en modifiant le handle associé à STDIN, STDOUT ou STDERR. Étant donné que les handles standard du parent sont hérités par tous les processus enfants, les appels suivants à GetStdHandle retourneront le handle redirigé. Un handle retourné par GetStdHandle peut, par conséquent, référencer autre chose que les E/S de la console. Par exemple, avant de créer un processus enfant, un processus parent peut utiliser SetStdHandle pour définir un handle de canal comme étant le handle STDIN hérité par le processus enfant. Lorsque le processus enfant appelle GetStdHandle, il obtient le handle du canal. Cela signifie que le processus parent peut contrôler les handles standard du processus enfant. Les handles retournés par GetStdHandle disposent d’un accès GENERIC_READ | GENERIC_WRITE, sauf si SetStdHandle a été utilisé dans le but de configurer un accès moindre pour le handle standard.

Les valeurs des handles retournées par GetStdHandle ne sont pas 0, 1 et 2. Par conséquent, les constantes de flux prédéfinies standard contenues dans Stdio.h (STDIN, STDOUT et STDERR) ne peuvent pas être utilisées dans les fonctions qui nécessitent un handle de console.

La fonction CreateFile permet à un processus d’obtenir un handle vers la mémoire tampon d’entrée et la mémoire tampon d’écran active de la console, même si STDIN et STDOUT ont été redirigés. Pour ouvrir le handle vers la mémoire tampon d’entrée d’une console, spécifiez la valeur CONIN$ dans un appel à CreateFile. Spécifiez la valeur CONOUT$ dans un appel à CreateFile pour ouvrir le handle vers la mémoire tampon d’écran active de la console. CreateFile vous permet de spécifier l’accès en lecture/écriture du handle qu’il retourne.

La fonction CreateConsoleScreenBuffer crée une mémoire tampon d’écran et retourne un handle. Ce handle peut être utilisé dans toutes les fonctions qui acceptent un handle vers la sortie de la console. La nouvelle mémoire tampon d’écran n’est pas active (affichée) tant que son handle n’est pas spécifié dans un appel à la fonction SetConsoleActiveScreenBuffer. Notez que le fait de changer la mémoire tampon d’écran active n’affecte pas le handle retourné par GetStdHandle. De même, l’utilisation de SetStdHandle pour modifier le handle STDOUT n’affecte pas la mémoire tampon d’écran active.

Les handles de console retournés par CreateFile et CreateConsoleScreenBuffer peuvent être utilisés dans toutes les fonctions de console qui nécessitent un handle vers la mémoire tampon d’entrée ou la mémoire tampon d’écran d’une console. Les handles retournés par GetStdHandle peuvent être utilisés par les fonctions de la console s’ils n’ont pas été redirigés pour référencer autre chose que les E/S de la console. Toutefois, si un handle standard a été redirigé pour référencer un fichier ou un canal, ce handle ne pourra être utilisé que par les fonctions ReadFile et WriteFile. GetFileType peut aider à déterminer le type d’appareil que le handle référence. Un handle de console se présente ainsi : FILE_TYPE_CHAR.

Un processus peut utiliser la fonction DuplicateHandle pour créer un handle de console dupliqué avec un accès ou un héritage différents de ceux du handle d’origine. Notez, toutefois, qu’un processus ne peut créer un handle de console dupliqué que pour sa propre utilisation. Cela diffère donc des autres types de handles (tels que les objets de fichier, de canal ou mutex), pour lesquels DuplicateHandle peut créer un doublon valide pour un processus différent. L’accès à une console doit être partagé lors de la création de l’autre processus, ou peut être demandé par l’autre processus par le biais du mécanisme AttachConsole.

Pour fermer un handle de console, un processus peut utiliser la fonction CloseHandle.