다음을 통해 공유


콘솔 핸들

콘솔 프로세스는 핸들을 사용하여 콘솔의 입력 및 화면 버퍼에 액세스합니다. 프로세스는 GetStdHandle, CreateFile 또는 CreateConsoleScreenBuffer 함수를 사용하여 이러한 핸들 중 하나를 열 수 있습니다.

GetStdHandle 함수는 프로세스와 연결된 표준 입력(STDIN), 표준 출력(STDOUT) 및 표준 오류(STDERR) 핸들을 검색하는 메커니즘을 제공합니다. 콘솔을 만드는 동안 시스템은 이러한 핸들을 만듭니다. 처음에는 STDIN 콘솔의 입력 버퍼에 대한 핸들이며 STDOUTSTDERR 콘솔의 활성 화면 버퍼 핸들입니다. 그러나 SetStdHandle 함수는 연결된 STDINSTDOUT핸들을 변경하여 표준 핸들을 리디렉션할 수 있습니다STDERR. 부모의 표준 핸들은 모든 자식 프로세스에서 상속되므로 GetStdHandle 에 대한 후속 호출은 리디렉션된 핸들을 반환합니다. 따라서 GetStdHandle에서 반환된 핸들은 콘솔 I/O 이외의 항목을 참조할 수 있습니다. 예를 들어 자식 프로세스를 만들기 전에 부모 프로세스는 SetStdHandle 을 사용하여 파이프 핸들 STDIN 을 자식 프로세스에서 상속되는 핸들로 설정할 수 있습니다. 자식 프로세스가 GetStdHandle을 호출하면 파이프 핸들을 가져옵니다. 즉, 부모 프로세스는 자식 프로세스의 표준 핸들을 제어할 수 있습니다. SetStdHandle을 사용하여 더 적은 액세스 권한을 가지 GENERIC_READ | GENERIC_WRITE 도록 표준 핸들을 설정하지 않는 한 GetStdHandle에서 반환된 핸들에 액세스할 수 있습니다.

GetStdHandle에서 반환된 핸들의 값은 0, 1 및 2가 아니므로 Stdio.h(STDINSTDOUTSTDERR)의 표준 미리 정의된 스트림 상수는 콘솔 핸들이 필요한 함수에서 사용할 수 없습니다.

CreateFile 함수를 사용하면 프로세스가 리디렉션된 경우에도 STDINSTDOUT 콘솔의 입력 버퍼 및 활성 화면 버퍼에 대한 핸들을 가져올 수 있습니다. 콘솔의 입력 버퍼에 대한 핸들을 열려면 CreateFile 호출에서 값을 지정 CONIN$ 합니다. CONOUT$ CreateFile 호출에서 콘솔의 활성 화면 버퍼에 대한 핸들을 여는 값을 지정합니다. CreateFile 을 사용하면 반환되는 핸들의 읽기/쓰기 액세스를 지정할 수 있습니다.

CreateConsoleScreenBuffer 함수는 새 화면 버퍼를 만들고 핸들을 반환합니다. 이 핸들은 콘솔 출력에 대한 핸들을 허용하는 모든 함수에서 사용할 수 있습니다. SetConsoleActiveScreenBuffer 함수에 대한 호출에서 핸들이 지정될 때까지 새 화면 버퍼가 활성(표시)되지 않습니다. 활성 화면 버퍼를 변경해도 GetStdHandle에서 반환된 핸들에는 영향을 주지 않습니다. 마찬가지로 SetStdHandle 을 사용하여 핸들을 변경해 STDOUT 도 활성 화면 버퍼에 영향을 주지 않습니다.

CreateFileCreateConsoleScreenBuffer에서 반환된 콘솔 핸들은 콘솔의 입력 버퍼 또는 콘솔 화면 버퍼에 대한 핸들이 필요한 콘솔 함수에서 사용할 수 있습니다. GetStdHandle에서 반환된 핸들은 콘솔 I/O 이외의 항목을 참조하도록 리디렉션되지 않은 경우 콘솔 함수에서 사용할 수 있습니다. 그러나 표준 핸들이 파일 또는 파이프를 참조하도록 리디렉션된 경우 ReadFileWriteFile 함수에서만 핸들을 사용할 수 있습니다. GetFileType 은 핸들이 참조하는 디바이스 유형을 결정하는 데 도움이 될 수 있습니다. 콘솔 핸들은 다음과 같이 FILE_TYPE_CHAR표시됩니다.

프로세스는 DuplicateHandle 함수를 사용하여 원래 핸들과 다른 액세스 또는 상속 가능성이 있는 중복 콘솔 핸들을 만들 수 있습니다. 그러나 프로세스는 자체 용도로만 중복 콘솔 핸들을 만들 수 있습니다. 이는 DuplicateHandle 이 다른 프로세스에 유효한 중복을 만들 수 있는 다른 핸들 형식(예: 파일, 파이프 또는 뮤텍스 개체)과 다릅니다. 콘솔에 대한 액세스는 다른 프로세스를 만드는 동안 공유되어야 하거나 AttachConsole 메커니즘을 통해 다른 프로세스에서 요청할 수 있습니다.

콘솔 핸들을 닫기 위해 프로세스에서 CloseHandle 함수를 사용할 수 있습니다.