Identificadores do console
Um processo de console usa identificadores para acessar os buffers de entrada e de tela do console dele. Um processo pode usar a função GetStdHandle, CreateFile ou CreateConsoleScreenBuffer para abrir um desses identificadores.
A função GetStdHandle oferece um mecanismo para recuperar os identificadores de entrada padrão (STDIN
), saída padrão (STDOUT
) e erro padrão (STDERR
) associados a um processo. Durante a criação do console, o sistema cria esses identificadores. Inicialmente, STDIN
é um identificador para o buffer de entrada do console e STDOUT
e STDERR
são identificadores do buffer de tela ativo do console. No entanto, a função SetStdHandle pode redirecionar os identificadores padrão alterando o identificador associado a STDIN
, STDOUT
ou STDERR
. Como os identificadores padrão do pai são herdados por qualquer processo filho, as chamadas subsequentes a GetStdHandle retornam o identificador redirecionado. Um identificador retornado por GetStdHandle pode, portanto, fazer referência a algo diferente da E/S do console. Por exemplo, antes de criar um processo filho, um processo pai pode usar SetStdHandle para definir um identificador de pipe como o identificador STDIN
que é herdado pelo processo filho. Quando o processo filho chama GetStdHandle, ele obtém o identificador de pipe. Isso significa que o processo pai pode controlar os identificadores padrão do processo filho. Os identificadores retornados por GetStdHandle têm acesso GENERIC_READ | GENERIC_WRITE
, a menos que SetStdHandle tenha sido usado para definir o identificador padrão para ter menos acesso.
O valor dos identificadores retornados por GetStdHandle não é 0, 1 e 2, portanto, as constantes de fluxo predefinidas padrão em Stdio.h (STDIN
, STDOUT
e STDERR
) não podem ser usadas em funções que exigem um identificador de console.
A função CreateFile permite que um processo obtenha um identificador para o buffer de entrada do console e o buffer de tela ativo dele, mesmo que STDIN
e STDOUT
tenham sido redirecionados. Para abrir um identificador para um buffer de entrada do console, especifique o valor CONIN$
em uma chamada para CreateFile. Especifique o valor CONOUT$
em uma chamada para CreateFile para abrir um identificador para um buffer de tela ativo do console. CreateFile permite que você especifique o acesso de leitura/gravação do identificador que ele retorna.
A função CreateConsoleScreenBuffer cria um buffer de tela e retorna um identificador. Esse identificador pode ser usado em qualquer função que aceite um identificador como saída do console. O novo buffer de tela não estará ativo (exibido) até que o identificador dele seja especificado em uma chamada para a função SetConsoleActiveScreenBuffer. Observe que a alteração do buffer de tela ativo não afeta o identificador retornado por GetStdHandle. Da mesma forma, o uso de SetStdHandle para alterar o identificador STDOUT
não afeta o buffer de tela ativo.
Identificadores de console retornados por CreateFile e CreateConsoleScreenBuffer podem ser usados em qualquer uma das funções de console que exigem um identificador para o buffer de entrada de um console ou de um buffer de tela do console. Os identificadores retornados por GetStdHandle poderão ser usados pelas funções de console se não tiverem sido redirecionados para fazer referência a algo diferente da E/S do console. Se um identificador padrão tiver sido redirecionado para fazer referência a um arquivo ou um pipe, contudo, o identificador só poderá ser usado pelas funções ReadFile e WriteFile. GetFileType pode ajudar a determinar a qual tipo de dispositivo o identificador se refere. Um identificador de console é apresentado como FILE_TYPE_CHAR
.
Um processo pode usar a função DuplicateHandle para criar um identificador de console duplicado que tenha acesso ou capacidade de herança diferente do identificador original. Observe, contudo, que um processo pode criar um identificador de console duplicado somente para seu uso. Isso difere de outros tipos de identificadores (como objetos de arquivo, pipe ou mutex), para os quais DuplicateHandle pode criar uma duplicata válida para um processo diferente. O acesso a um console precisa ser compartilhado durante a criação do outro processo ou pode ser solicitado pelo outro processo por meio do mecanismo AttachConsole.
Para fechar um identificador de console, um processo pode usar a função CloseHandle.