Принцип диалога с консолью, размещённой ОС

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Принцип диалога с консолью, размещённой ОС

Сообщение GSerg » 04.10.2004 (Пн) 22:44

Привыкли, что подобные утвердительно звучащие темы содержат в себе что-то вроде статьи? :wink: Ан нет, на сей раз задаю вопрос.

Есть такая вещь, как subsystem. Если оная - CONSOLE, то консоль размещает сам загрузчик операционки.
Вопрос: каким образом всё это компилируется так, чтобы впоследствии вёлся прямой диалог с этой консолью? Если я, к примеру, в C++ делаю консольное приложение и использую cout<<, то это будет скомпилировано во что? Ведь выводится же в консоль. При этом если проанализировать точку входа exe, то никаких внешних функций там не вызывается (то есть всякие там GetStdHandle или из области Console чего...) - всё напрямую.
Как это делает компилятор? К чему он присобачивается?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.10.2004 (Пн) 22:54

Точно-точно GetStdHandle должно вызываться.
Посмотри в С:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\crt0.c
У меня исходники не стоят, а дистрибутива дома нету :-(

Подожди, нашёл дистрибутив VC4... Точно. mainCRTStartup() вызывает _ioinit(), а там вот что:
Код: Выделить всё
        /*
         * If valid HANDLE-s for standard input, output and error were not
         * inherited, try to obtain them directly from the OS. Also, set the
         * appropriate bits in the osfile fields.
         */
        for ( fh = 0 ; fh < 3 ; fh++ ) {

            pio = __pioinfo[0] + fh;

            if ( pio->osfhnd == (long)INVALID_HANDLE_VALUE ) {
                /*
                 * mark the handle as open in text mode.
                 */
                pio->osfile = (char)(FOPEN | FTEXT);

                if ( ((stdfh = (long)GetStdHandle( stdhndl(fh) ))
                     != (long)INVALID_HANDLE_VALUE) && ((htype =
                     GetFileType( (HANDLE)stdfh )) != FILE_TYPE_UNKNOWN) )
                {
                    /*
                     * obtained a valid HANDLE from GetStdHandle
                     */
                    pio->osfhnd = stdfh;


Так что я был прав :-)
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.10.2004 (Пн) 23:42

Эй, а чего это у меня нет CRT\SRC? :roll:
Вот и не смог сам найти...

Тэкс, пойдём делать далеко идущие выводы :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.10.2004 (Вт) 0:06

GSerg писал(а):Эй, а чего это у меня нет CRT\SRC? :roll:
Вот и не смог сам найти...

Значит, не стоит...
Поставь - легче жить станет :-)
Изображение


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 93

    TopList  
cron