Partilhar via


Alças do console

Um processo de console usa alças para acessar os buffers de entrada e de tela de seu console. Um processo pode usar a função GetStdHandle, CreateFile ou CreateConsoleScreenBuffer para abrir um desses identificadores.

A função GetStdHandle fornece 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 essas alças. Inicialmente, STDIN é um identificador para o buffer de entrada do console, e STDOUTSTDERR são alças do buffer de tela ativa do console. No entanto, a função SetStdHandle pode redirecionar as alças padrão alterando a alça associada STDINa , STDOUTou STDERR. Como os identificadores padrão do pai são herdados por qualquer processo filho, as chamadas subsequentes para GetStdHandle retornam o identificador redirecionado. Um identificador retornado por GetStdHandle pode, portanto, referir-se a algo diferente de E/S de console. Por exemplo, antes de criar um processo filho, um processo pai pode usar SetStdHandle para definir uma alça de pipe para ser a STDIN alça herdada pelo processo filho. Quando o processo filho chama GetStdHandle, ele obtém a alça do tubo. Isso significa que o processo pai pode controlar as alças padrão do processo filho. Os identificadores retornados por GetStdHandle têm GENERIC_READ | GENERIC_WRITE acesso, 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 sã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 e o buffer de tela ativa do console, mesmo STDINSTDOUT que e tenham sido redirecionados. Para abrir um identificador para o buffer de entrada de um console, especifique o CONIN$ valor em uma chamada para CreateFile. Especifique o CONOUT$ valor em uma chamada para CreateFile para abrir um identificador para o buffer de tela ativo de um console. CreateFile permite que você especifique o acesso de leitura/gravação do identificador que ele retorna.

A função CreateConsoleScreenBuffer cria um novo buffer de tela e retorna um identificador. Esse identificador pode ser usado em qualquer função que aceite um identificador para a saída do console. O novo buffer de tela não está ativo (exibido) até que seu identificador seja especificado em uma chamada para a função SetConsoleActiveScreenBuffer . Observe que alterar o buffer de tela ativo não afeta o identificador retornado por GetStdHandle. Da mesma forma, usar SetStdHandle para alterar o STDOUT identificador não afeta o buffer de tela ativo.

Os identificadores de console retornados por CreateFile e CreateConsoleScreenBuffer podem ser usados em qualquer uma das funções do 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 podem ser usados pelas funções do console se não tiverem sido redirecionados para se referir a algo diferente de E/S do console. No entanto, se um identificador padrão tiver sido redirecionado para se referir a um arquivo ou pipe, o identificador só poderá ser usado pelas funções ReadFile e WriteFile . GetFileType pode ajudar a determinar a que tipo de dispositivo o identificador se refere. Uma alça de console se apresenta como FILE_TYPE_CHAR.

Um processo pode usar a função DuplicateHandle para criar um identificador de console duplicado que tenha acesso ou herança diferente do identificador original. Observe, no entanto, que um processo pode criar um identificador de console duplicado apenas para seu próprio uso. Isso difere de outros tipos de identificador (como objetos file, pipe ou mutex), para os quais DuplicateHandle pode criar uma duplicata válida para um processo diferente. O acesso a um console deve ser compartilhado durante a criação do outro processo ou pode ser solicitado pelo outro processo através do mecanismo AttachConsole .

Para fechar uma alça de console, um processo pode usar a função CloseHandle .