Condividi tramite


Handle della console

Un processo della console usa handle per accedere ai buffer di input e schermo della console. Un processo può usare la funzione GetStdHandle, CreateFile o CreateConsoleScreenBuffer per aprire uno di questi handle.

La funzione GetStdHandle fornisce un meccanismo per il recupero dell'input standard (STDIN), dell'output standard () e degli handle di errore standard (STDOUTSTDERR) associati a un processo. Durante la creazione della console, il sistema crea questi handle. Inizialmente, STDIN è un handle per il buffer di input della console e STDOUTSTDERR sono handle del buffer dello schermo attivo della console. Tuttavia, la funzione SetStdHandle può reindirizzare gli handle standard modificando l'handle associato a STDIN, STDOUTo STDERR. Poiché gli handle standard dell'elemento padre vengono ereditati da qualsiasi processo figlio, le chiamate successive a GetStdHandle restituiscono l'handle reindirizzato. Un handle restituito da GetStdHandle può quindi fare riferimento a un elemento diverso dall'I/O della console. Ad esempio, prima di creare un processo figlio, un processo padre può usare SetStdHandle per impostare un handle pipe come STDIN handle ereditato dal processo figlio. Quando il processo figlio chiama GetStdHandle, ottiene l'handle pipe. Ciò significa che il processo padre può controllare gli handle standard del processo figlio. Gli handle restituiti da GetStdHandle hanno GENERIC_READ | GENERIC_WRITE accesso a meno che Non sia stato usato SetStdHandle per impostare l'handle standard in modo da avere accesso minore.

Il valore degli handle restituiti da GetStdHandle non è 0, 1 e 2, pertanto le costanti di flusso predefinite standard in Stdio.h (STDIN, STDOUTe STDERR) non possono essere usate nelle funzioni che richiedono un handle della console.

La funzione CreateFile consente a un processo di ottenere un handle nel buffer di input della console e nel buffer dello schermo attivo, anche se STDIN e STDOUT sono stati reindirizzati. Per aprire un handle nel buffer di input di una console, specificare il CONIN$ valore in una chiamata a CreateFile. Specificare il CONOUT$ valore in una chiamata a CreateFile per aprire un handle nel buffer dello schermo attivo di una console. CreateFile consente di specificare l'accesso in lettura/scrittura dell'handle restituito.

La funzione CreateConsoleScreenBuffer crea un nuovo buffer dello schermo e restituisce un handle. Questo handle può essere usato in qualsiasi funzione che accetta un handle per l'output della console. Il nuovo buffer dello schermo non è attivo (visualizzato) fino a quando non viene specificato il relativo handle in una chiamata alla funzione SetConsoleActiveScreenBuffer . Si noti che la modifica del buffer dello schermo attivo non influisce sull'handle restituito da GetStdHandle. Analogamente, l'uso di SetStdHandle per modificare l'handle STDOUT non influisce sul buffer dello schermo attivo.

Gli handle della console restituiti da CreateFile e CreateConsoleScreenBuffer possono essere usati in una delle funzioni della console che richiedono un handle per il buffer di input di una console o di un buffer dello schermo della console. Gli handle restituiti da GetStdHandle possono essere usati dalle funzioni della console se non sono stati reindirizzati per fare riferimento a un elemento diverso dall'I/O della console. Se un handle standard è stato reindirizzato per fare riferimento a un file o a una pipe, tuttavia, l'handle può essere usato solo dalle funzioni ReadFile e WriteFile . GetFileType può facilitare la determinazione del tipo di dispositivo a cui fa riferimento l'handle. Un handle della console presenta come FILE_TYPE_CHAR.

Un processo può usare la funzione DuplicateHandle per creare un handle di console duplicato con accesso o ereditabilità diversi dall'handle originale. Si noti, tuttavia, che un processo può creare un handle di console duplicato solo per il proprio uso. Ciò differisce da altri tipi di handle (ad esempio file, pipe o oggetti mutex), per cui DuplicateHandle può creare un duplicato valido per un processo diverso. L'accesso a una console deve essere condiviso durante la creazione dell'altro processo o può essere richiesto dall'altro processo tramite il meccanismo AttachConsole .

Per chiudere un handle della console, un processo può usare la funzione CloseHandle .