Заметки по WinAPI

Консольное приложение

  • консольное приложение

    • приложение в котором взаимодействие с пользователем осуществляется через консоль
    • оно запускается из консоли в блокирующем режиме
    • различная обработка при запуске приложения
      • основное различие: в PE Header'е: WORD Subsystem = 2 для GUI и 3 для консоли
    • ну и вставлю сюда цитату из Рихтера

      • "Windows поддерживает два типа приложений: основанные на графическом интерфей се (graphical user interface, GUI) и консольные (console user interface, CUI) V приложе ний первого типа внешний интерфейс чисто графический GUI-приложения создают окна, имеют меню, взаимодействуют с пользователем через диалоговые окна и вооб ще пользуются всей стандартной "Windows'oвской" начинкой. Почти все стандартные программы Windows — Notepad, Calculator, Wordpad и др — являются GUI-приложе ниями. Приложения консольного типа работают в текстовом режиме: они не форми руют окна, не обрабатывают сообщения и не требуют GUI. И хотя консольные при ложения на экране тоже размещаются в окне, в нем содержится только текст. Коман дные процессоры вроде Cmd.exe (в Windows 2000) или Command.com (в Windows 98) — типичные образцы подобных приложений.

        Вместе с тем граница между двумя типами приложений весьма условна. Можно, например, создать консольное приложение, способное отображать диалоговые окна. Скажем, в командном процессоре вполне может быть специальная команда, открыва ющая графическое диалоговое окно со списком команд, вроде мелочь — а избавляет от запоминания лишней информации В то же время можно создать и GUI-приложе ние, выводящее текстовые строки в консольное окно. Я сам часто писал такие пpoграммы: создав консольное окно, я пересылал в него отладочную информацию, свя занную с исполняемым приложением. Но, конечно, графический интерфейс предпоч тительнее, чем старомодный текстовый Как показывает опыт, приложения на основе GUI "дружественнее" к пользователю, а значит и более популярны

        Когда Вы создаете проект приложения, Microsoft Visual C++ устанавливает такие ключи для компоновщика, чтобы в исполняемом файле был указан соответствующий тип подсистемы Для CUI-программ используется ключ /SUBSYSTEM:CONSOLE, а для GUI-приложений — /SUBSYSTEM:WINDOWS Когда пользователь запускает приложе ние, загрузчик операционной системы проверяет помер подсистемы, хранящийся в заголовке образа исполняемого файла, и определяет, что это за программа — GUI или СUI Если номер указывает на приложение последнего типа, загрузчик автоматичес ки создает текстовое консольное окно, а если номер свидетельствует о противопо ложном — просто загружает программу в память После того как приложение начи нает работать, операционная система больше не интересуется, к какому типу оно относится"

  • главная функция main(ANSI-строки) или wmain(unicode-строки)

      - int __cdecl (w)main( int argc, char *argv[], char *envp[] )
    
    • стартовая функция ( инициализирует библиотеку С/С++, чтобы работали malloc/free и обеспечивает корректное создание любых объявленных глобальных и статических объектов)

      • (w)mainCRTStartup
      • что она делает
        • считывают указатель на командную строку нашего процесса
        • считывает указатель на переменные окружения нашего процесса
        • инициализируют глобальные переменные из библ. С/С++
        • инициализируют кучу malloc/free
        • вызывает конструкторы всех global и static объектов
    • работа с консолью

      • a process can be associated with ONLY ONE console...
      • основные функции для работы с консолью:
        • BOOL AllocConsole(void)
          • вернет TRUE и сработает верно только когда процесс не имеет других консолей
          • инициализирует stdin/stdout/stderr хэндлы для новой консоли
        • BOOL WINAPI FreeConsole(void)
          • освобождает текущую консоль процесса
        • BOOL WINAPI AttachConsole(DWORD dwProcessId)
          • привязывается к консоли процесса с данным id
          • пытается привязаться к консоли родительского процесса если передана -1