콘솔 핸들
콘솔 프로세스는 핸들을 사용하여 콘솔의 입력 및 화면 버퍼에 액세스합니다. 프로세스에서 GetStdHandle, CreateFile 또는 CreateConsoleScreenBuffer 함수를 사용하여 이러한 핸들 중 하나를 열 수 있습니다.
GetStdHandle 함수는 프로세스와 관련된 표준 입력(STDIN
), 표준 출력(STDOUT
) 및 표준 오류(STDERR
) 핸들을 검색하는 메커니즘을 제공합니다. 콘솔을 만드는 중에 시스템에서 이러한 핸들을 만듭니다. 처음에는 STDIN
이 콘솔의 입력 버퍼에 대한 핸들이며, STDOUT
및 STDERR
은 콘솔의 활성 화면 버퍼에 대한 핸들입니다. 그러나 SetStdHandle 함수는 STDIN
, STDOUT
또는 STDERR
와 연결된 핸들을 변경하여 표준 핸들을 리디렉션할 수 있습니다. 부모의 표준 핸들은 자식 프로세스에 상속되므로 GetStdHandle에 대한 후속 호출은 리디렉션 핸들을 반환합니다. 따라서 GetStdHandle에서 반환하는 핸들은 콘솔 I/O 이외의 항목을 참조할 수 있습니다. 예를 들어 자식 프로세스를 만들기 전에 부모 프로세스에서 SetStdHandle을 사용하여 파이프 핸들을 자식 프로세스에서 상속하는 STDIN
핸들로 설정할 수 있습니다. 자식 프로세스에서 GetStdHandle을 호출하면 파이프 핸들을 가져옵니다. 즉, 부모 프로세스에서 자식 프로세스의 표준 핸들을 제어할 수 있습니다. 액세스 권한이 낮은 표준 핸들을 설정하는 데 SetStdHandle을 사용한 경우를 제외하고는 GetStdHandle에서 반환하는 핸들에는 GENERIC_READ | GENERIC_WRITE
액세스 권한이 있습니다.
GetStdHandle에서 반환하는 핸들의 값은 0, 1 및 2가 아니므로 Stdio.h(STDIN
, STDOUT
및 STDERR
)의 미리 정의된 표준 스트림 상수는 콘솔 핸들이 필요한 함수에서 사용할 수 없습니다.
CreateFile 함수를 사용하면 STDIN
및 STDOUT
이 리디렉션된 경우에도 프로세스에서 콘솔의 입력 버퍼 및 활성 화면 버퍼에 대한 핸들을 가져올 수 있습니다. 콘솔의 입력 버퍼에 대한 핸들을 열려면 CreateFile 호출에서 CONIN$
값을 지정합니다. 콘솔의 활성 화면 버퍼에 대한 핸들을 열려면 CreateFile 호출에서 CONOUT$
값을 지정합니다. CreateFile을 사용하면 반환되는 핸들의 읽기/쓰기 액세스 권한을 지정할 수 있습니다.
CreateConsoleScreenBuffer 함수는 새 화면 버퍼를 만들고 핸들을 반환합니다. 이 핸들은 콘솔 출력에 대한 핸들을 허용하는 모든 함수에 사용할 수 있습니다. 새 화면 버퍼의 핸들이 SetConsoleActiveScreenBuffer 함수 호출에 지정될 때까지 해당 버퍼는 활성화(표시)되지 않습니다. 활성 화면 버퍼를 변경해도 GetStdHandle에서 반환하는 핸들에는 영향을 주지 않습니다. 마찬가지로 SetStdHandle을 사용하여 STDOUT
핸들을 변경해도 활성 화면 버퍼에는 영향을 주지 않습니다.
CreateFile 및 CreateConsoleScreenBuffer에서 반환하는 콘솔 핸들은 콘솔의 입력 버퍼에 대한 핸들이 필요한 콘솔 함수 또는 콘솔 화면 버퍼에서 사용할 수 있습니다. GetStdHandle에서 반환하는 핸들은 콘솔 I/O 이외의 항목을 참조하도록 리디렉션되지 않은 경우 콘솔 함수에서 사용할 수 있습니다. 그러나 파일 또는 파이프를 참조하도록 표준 핸들을 리디렉션한 경우 핸들은 ReadFile 및 WriteFile 함수에서만 사용할 수 있습니다. GetFileType은 핸들에서 참조하는 디바이스 유형을 확인하는 데 도움이 될 수 있습니다. 콘솔 핸들은 FILE_TYPE_CHAR
로 표시됩니다.
프로세스에서 DuplicateHandle 함수를 사용하여 원래 핸들과 다른 액세스 또는 상속 가능성이 있는 중복 콘솔 핸들을 만들 수 있습니다. 그러나 프로세스는 자체 용도로만 중복 콘솔 핸들을 만들 수 있습니다. 이는 DuplicateHandle에서 다른 프로세스에 유효한 중복을 만들 수 있는 다른 핸들 형식(예: 파일, 파이프 또는 뮤텍스 개체)과 다릅니다. 콘솔에 대한 액세스는 프로세스를 만드는 중에 공유해야 하거나 다른 프로세스에서 AttachConsole 메커니즘을 통해 요청할 수 있습니다.
콘솔 핸들을 닫기 위해 프로세스에서 CloseHandle 함수를 사용할 수 있습니다.