Udostępnij przez


Uchwyty konsoli

Proces konsoli używa uchwytów do uzyskiwania dostępu do wejściowych i ekranowych konsoli programu . Proces może użyć funkcji GetStdHandle, CreateFile lub CreateConsoleScreenBuffer , aby otworzyć jeden z tych dojść.

Funkcja GetStdHandle udostępnia mechanizm pobierania standardowych danych wejściowych (STDIN), standardowych danych wyjściowych (STDOUT) i standardowych dojść błędów (STDERR) skojarzonych z procesem. Podczas tworzenia konsoli system tworzy te dojścia. STDIN Początkowo jest dojściem do buforu wejściowego konsoli i STDOUTSTDERR obsługuje aktywny bufor ekranu konsoli. Jednak funkcja SetStdHandle może przekierować standardowe dojścia, zmieniając uchwyt skojarzony z STDINSTDOUT, lub STDERR. Ponieważ standardowe dojścia elementu nadrzędnego są dziedziczone przez dowolny proces podrzędny, kolejne wywołania metody GetStdHandle zwracają przekierowany uchwyt. Dojście zwrócone przez metodę GetStdHandle może w związku z tym odwoływać się do czegoś innego niż operacje we/wy konsoli. Na przykład przed utworzeniem procesu podrzędnego proces nadrzędny może użyć metody SetStdHandle , aby ustawić uchwyt potoku jako STDIN uchwyt dziedziczony przez proces podrzędny. Gdy proces podrzędny wywołuje metodę GetStdHandle, pobiera uchwyt potoku. Oznacza to, że proces nadrzędny może kontrolować standardowe dojścia procesu podrzędnego. Dojścia zwrócone przez getStdHandle mają GENERIC_READ | GENERIC_WRITE dostęp, chyba że setStdHandle został użyty do ustawienia standardowego dojścia w celu uzyskania mniejszego dostępu.

Wartość uchwytów zwracanych przez metodę GetStdHandle nie jest równa 0, 1 i 2, więc standardowe wstępnie zdefiniowane stałe strumienia w stdio.h (STDIN, STDOUTi STDERR) nie mogą być używane w funkcjach wymagających uchwytu konsoli.

Funkcja CreateFile umożliwia proces uzyskiwania dojścia do buforu wejściowego konsoli i aktywnego buforu ekranu, nawet jeśli STDIN i STDOUT zostały przekierowane. Aby otworzyć dojście do buforu wejściowego konsoli, określ CONIN$ wartość w wywołaniu metody CreateFile. CONOUT$ Określ wartość w wywołaniu metody CreateFile, aby otworzyć dojście do aktywnego buforu ekranu konsoli. Funkcja CreateFile umożliwia określenie dostępu do odczytu/zapisu do uchwytu, który zwraca.

Funkcja CreateConsoleScreenBuffer tworzy nowy bufor ekranu i zwraca uchwyt. Ten uchwyt może być używany w dowolnej funkcji, która akceptuje dojście do danych wyjściowych konsoli. Nowy bufor ekranu nie jest aktywny (wyświetlany), dopóki nie zostanie określony w wywołaniu funkcji SetConsoleActiveScreenBuffer . Należy pamiętać, że zmiana aktywnego buforu ekranu nie ma wpływu na dojście zwrócone przez GetStdHandle. Podobnie użycie polecenia SetStdHandle w celu zmiany uchwytu STDOUT nie wpływa na aktywny bufor ekranu.

Dojścia konsoli zwracane przez funkcję CreateFile i CreateConsoleScreenBuffer mogą być używane w dowolnej funkcji konsoli, które wymagają uchwytu do buforu wejściowego konsoli lub buforu ekranu konsoli. Obsługa zwracana przez funkcję GetStdHandle może być używana przez funkcje konsoli, jeśli nie zostały przekierowane w celu odwoływania się do czegoś innego niż operacje we/wy konsoli. Jeśli standardowe dojście zostało przekierowane w celu odwoływania się do pliku lub potoku, jednak uchwyt może być używany tylko przez funkcje ReadFile i WriteFile . GetFileType może pomóc w określeniu typu urządzenia, do jakiego odnosi się dojście. Uchwyt konsoli jest obecny jako FILE_TYPE_CHAR.

Proces może użyć funkcji DuplicateHandle , aby utworzyć zduplikowany uchwyt konsoli, który ma inny dostęp lub dziedziczenie z oryginalnego uchwytu. Należy jednak pamiętać, że proces może utworzyć zduplikowaną obsługę konsoli tylko do użytku własnego. Różni się to od innych typów dojść (takich jak plik, potok lub obiekty mutex), dla których DuplicateHandle może utworzyć duplikat prawidłowy dla innego procesu. Dostęp do konsoli musi być udostępniany podczas tworzenia innego procesu lub może być wymagany przez inny proces za pośrednictwem mechanizmu AttachConsole .

Aby zamknąć uchwyt konsoli, proces może użyć funkcji CloseHandle .