Condividi tramite


Handle della console

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

La funzione GetStdHandle offre un meccanismo per recuperare gli handle di input standard (STDIN), di output standard (STDOUT) e di errore standard (STDERR) 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 STDOUT e STDERR sono handle del buffer dello schermo attivo della console. Tuttavia, la funzione SetStdHandle può reindirizzare gli handle standard modificando l'handle associato a STDIN, STDOUT o STDERR. Poiché gli handle standard del padre vengono ereditati da qualsiasi processo figlio, le chiamate successive a GetStdHandle restituiscono l'handle reindirizzato. Un handle restituito da GetStdHandle può pertanto fare riferimento a un elemento diverso dall'I/O della console. Prima di creare un processo figlio, ad esempio, un processo padre può usare SetStdHandle per impostare un handle di pipe in modo che sia l'handle STDIN ereditato dal processo figlio. Quando il processo figlio chiama GetStdHandle, ottiene l'handle di pipe. Questo significa che il processo padre può controllare gli handle standard del processo figlio. Gli handle restituiti da GetStdHandle dispongono dell'accesso GENERIC_READ | GENERIC_WRITE, a meno che non sia stato usato SetStdHandle per impostare un livello di accesso inferiore per l'handle standard.

I valori degli handle restituiti da GetStdHandle non sono 0, 1 e 2, pertanto le costanti di flusso predefinite standard in Stdio.h (STDIN, STDOUT e STDERR) non possono essere usate in funzioni che richiedono un handle della console.

La funzione CreateFile consente a un processo di ottenere un handle per il buffer di input e il buffer dello schermo attivo della relativa console, anche se STDIN e STDOUT sono stati reindirizzati. Per aprire un handle per il buffer di input di una console, specificare il valore CONIN$ in una chiamata a CreateFile. Per aprire un handle per il buffer dello schermo attivo di una console, specificare il valore CONOUT$ in una chiamata a CreateFile. 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 qualsiasi funzione della console che richiede un handle per il buffer di input o il buffer dello schermo di una console. Gli handle restituiti da GetStdHandle possono essere utilizzati dalle funzioni della console se non sono stati reindirizzati per fare riferimento a elementi diversi dall'I/O della console. Se invece un handle standard è stato reindirizzato per fare riferimento a un file o a una pipe, può essere usato solo dalle funzioni ReadFile e WriteFile. GetFileType può essere utile per determinare il tipo di dispositivo a cui fa riferimento l'handle. Un handle della console si presenta come FILE_TYPE_CHAR.

Un processo può usare la funzione DuplicateHandle per creare un handle della console duplicato con accesso o ereditarietà differente rispetto all'handle originale. Si noti, tuttavia, che un processo può creare un handle della console duplicato solo a proprio uso. Questo comportamento è diverso da quello degli altri tipi di handle, ad esempio file, pipe o oggetti mutex, per i quali 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.