Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы.doc
Скачиваний:
1
Добавлен:
30.08.2019
Размер:
260.1 Кб
Скачать
  1. GUI-программа для Windows. Варианты входной функции программы.

GUI (Graphical user interface, графический пользовательский интерфейс) — разновидность пользовательского интерфейса, в котором элементы интерфейса (меню, кнопки, значки, списки и т. п.), представленные пользователю на дисплее, исполнены в виде графических изображений.

В GUI пользователь имеет произвольный доступ (с помощью устройств ввода — клавиатуры, мыши, джойстика и т. п.) ко всем видимым экранным объектам (элементам интерфейса) и осуществляет непосредственное манипулирование ими.

Для GUI-программ используется ключ для компоновщика, чтобы в исполняемом файле был указан соответствующий тип подсистемы - /SUBSYSTEM:WINDOWS. Затем загрузчик загружает программу в память.

Во всех Windows-приложениях должна быть входная функция. Существует четыре такие функции:

  1. int WINAPI WinMain (HINSTANCE hinst, HINSTANCE, LPSTR pszCmdLine, int nCmdShow);

  2. int WINAPT wWinMain (HINSTANCE hinst, HINSTANCE hPrelnst, PWSTR pszCmdLine, int nCmdShow);

Первый параметр, hInst, представляет собой дескриптор экземпляра приложения.

Второй, hPrelnst, всегда содержит значение NULL, что указывает на отсутствие других, запущенных ранее, экземпляров приложения.

Третий параметр, pszCmdLine, служит указателем на строку, завершающуюся нулевым символом и содержащую командную строку программы.

Последний параметр, nCmdShow, задает одну из многочисленных констант, определяющих возможные варианты отображения окна, например SW_SHOWNORMAL, SW_SHOWMAXIMIZED или SW_SHOWMINIMIZED.

  1. int _cdecl main (int argc, char*argv[], char*envp[]);

  2. int _cdecl wmain (int argc, wchar_t*argv[], wchar_t*envp[]);

На самом деле входная функция операционной системой не вызывается. Вместо этого происходит обращение к стартовой функции из библиотеки С++. Она инициализирует библиотеку С++, а также обеспечивает корректное создание любых объявленных глобальных и статических С++-объектов до того, как начнется выполнение кода.

Тип приложения

Входная функция

Стартовая функция

GUI-приложение, работающее с ANSI-символами и строками

WinMain

WinMainCRTStartup

GUI-приложение, работающее с Unicode-символами и строками

wWinMain

wWinMainCRTStartup

СUI-приложение, работающее с ANSI-символами и строками

main

mainCRTStartup

СUI-приложение, работающее с Unicode-символами и строками

wmain

wmainCRTStartup

В проекте можно вообще не указывать ключ /SUBSYSTEM компоновщика, тогда компоновщик будет сам определять подсистему для приложения. При компоновке он проверит, какая из четырех функций (WinMain, wWinMain, main или wmain) присутствует в коде, и на основании этого выберет подсистему и стартовую функцию из библиотеки С++.

Все стартовые функции выполняют:

  1. считывают указатель на полную командную строку нового процесса;

  2. считывают указатель на переменные окружения нового процесса;

  3. инициализируют глобальные переменные из библиотеки С++, доступ к которым из кода обеспечивается включением файла StdLib.h.

  4. инициализируют кучу (динамически распределяемую область памяти), используемую С-функциями выделения памяти (malloc и calloc) и другими процедурами низкоуровневого ввода-вывода;

  5. вызывают конструкторы всех глобальных и статических объектов С++-классов.

Когда входная функция возвращает управление, стартовая обращается к функции exit библиотеки С++ и передает ей значение nMainRetVal. Функция exit выполняет следующие операции:

  1. вызывает все функции, зарегистрированные вызовами функции _onexit;

  2. вызывает деструкторы всех глобальных и статических объектов С++-классов;

  3. вызывает Windows-функцию ExitProcess, передавая ей значение nMainRetVal. Это заставляет операционную систему уничтожить процесс и установить код его завершения.

  1. CUI-программа для Windows. Варианты входной функции программы.

Приложения CUI (Сonsole user interface, консольный пользовательский интерфейс) работают в текстовом режиме: они не формируют окна, не обрабатывают сообщения и не требуют GUI. И хотя консольные приложения на экране тоже размещаются в окне, в нем содержится только текст.

Для CUI-программ используется ключ для компоновщика, чтобы в исполняемом файле был указан соответствующий тип подсистемы - /SUBSYSTEM:CONSOLE. Затем загрузчик автоматически создает текстовое консольное окно.

Во всех Windows-приложениях должна быть входная функция. Существует четыре такие функции:

  1. int WINAPI WinMain (HINSTANCE hinst, HINSTANCE, LPSTR pszCmdLine, int nCmdShow);

  2. int WINAPT wWinMain (HINSTANCE hinst, HINSTANCE hPrelnst, PWSTR pszCmdLine, int nCmdShow);

Первый параметр, hInst, представляет собой дескриптор экземпляра приложения.

Второй, hPrelnst, всегда содержит значение NULL, что указывает на отсутствие других, запущенных ранее, экземпляров приложения.

Третий параметр, pszCmdLine, служит указателем на строку, завершающуюся нулевым символом и содержащую командную строку программы.

Последний параметр, nCmdShow, задает одну из многочисленных констант, определяющих возможные варианты отображения окна, например SW_SHOWNORMAL, SW_SHOWMAXIMIZED или SW_SHOWMINIMIZED.

  1. int _cdecl main (int argc, char*argv[], char*envp[]);

  2. int _cdecl wmain (int argc, wchar_t*argv[], wchar_t*envp[]);

На самом деле входная функция операционной системой не вызывается. Вместо этого происходит обращение к стартовой функции из библиотеки С++. Она инициализирует библиотеку С++, а также обеспечивает корректное создание любых объявленных глобальных и статических С++-объектов до того, как начнется выполнение кода.

Тип приложения

Входная функция

Стартовая функция

GUI-приложение, работающее с ANSI-символами и строками

WinMain

WinMainCRTStartup

GUI-приложение, работающее с Unicode-символами и строками

wWinMain

wWinMainCRTStartup

СUI-приложение, работающее с ANSI-символами и строками

main

mainCRTStartup

СUI-приложение, работающее с Unicode-символами и строками

wmain

wmainCRTStartup

В проекте можно вообще не указывать ключ /SUBSYSTEM компоновщика, тогда компоновщик будет сам определять подсистему для приложения. При компоновке он проверит, какая из четырех функций (WinMain, wWinMain, main или wmain) присутствует в коде, и на основании этого выберет подсистему и стартовую функцию из библиотеки С++.

Все стартовые функции выполняют:

  1. считывают указатель на полную командную строку нового процесса;

  2. считывают указатель на переменные окружения нового процесса;

  3. инициализируют глобальные переменные из библиотеки С++, доступ к которым из кода обеспечивается включением файла StdLib.h.

  4. инициализируют кучу (динамически распределяемую область памяти), используемую С-функциями выделения памяти (malloc и calloc) и другими процедурами низкоуровневого ввода-вывода;

  5. вызывают конструкторы всех глобальных и статических объектов С++-классов.

Когда входная функция возвращает управление, стартовая обращается к функции exit библиотеки С++ и передает ей значение nMainRetVal. Функция exit выполняет следующие операции:

  1. вызывает все функции, зарегистрированные вызовами функции _onexit;

  2. вызывает деструкторы всех глобальных и статических объектов С++-классов;

  3. вызывает Windows-функцию ExitProcess, передавая ей значение nMainRetVal. Это заставляет операционную систему уничтожить процесс и установить код его завершения.

  1. Концепция программы управляемой событиями.

Программы, управляемые событиями, обладают большей гибкостью в смысле выбора пользователем порядка выполнения операций. Характерно то, что последовательность действий часто определяется операционной системой и зависит от потока сообщений о событиях в системе. Большую часть времени приложение, управляемое событиями, находится в состоянии ожидания событий, точнее сообщений о них. Сообщения могут поступать от различных источников, но все они попадают в одну очередь системных сообщений. Только некоторые из них система передаст в очередь сообщений вашего приложения. В случае многопотокового приложения сообщение приходит активному потоку (thread) приложения. Приложение постоянно выполняет цикл ожидания сообщений. Как только придет адресованное ему сообщение, управление будет передано его окопной процедуре.

  1. Кодировки символов. Unicode.

Чтобы реализовать возможность компиляции и ANSI, и Unicode C++ одновременно, нужно заменить в программе заголовочный файл String.h на TChar.h Он помогает создавать универсальный исходный код, способный задействовать как ANSI, так и Unicode. Он состоит из макросов, заменяющих явные вызовы str- или wcs-функций. Если при компиляции исходного кода Вы определяете _UNICODE, макросы ссылаются на wcs-функции, а в его отсутствие — на str-функции.

ANSI

UNICODE

универсальный исходный код (TChar.h)

Символ

char

wchar_t

TCHAR

Строка

char*STR

wchar_t*WSTR

PTSTR TCHAR*

Литерал

“строка”

L”строка”

_TEXT (“строка”)

Const строка

PCSTR

PCWSRT

PCTSTR

Существует две функции CreateWindowEx: одна принимает строки в Unicode, другая — в ANSI. Все так, но в действительности прототипы этих функций чуть-чуть отличаются:

HWND WINAPI CreateWindowExW (

DWORD dwExStyle,

PCWSTR pClassName,

PCWSTR pWindowName,

DWORD dwStyle, int X, Int Y,

int nWidth, int nHeight,

HWND hWndParent,

HMENU hMenu,

HINSTANCE hInstance,

PVOID pParam);

HWND WINAPI CreateWindowExA (

DWORD dwExStyle,

PCSTR pClasaName,

PCSTR pWindowName,

DWORD dwStyle, int X, int Y,

int nWidth, int nHeight,

HWND hWndParent,

HMENU hMenu,

HINSTANCE hInstance,

PVOID pParam);

CreateWindowExW — это Unicode-версия. Буква W в конце имени функции — аббревиатура слова wide (широкий). Буква A в конце имени CreateWindowExA указывает, что данная версия функции принимает ANSI-строки.

Windows-функция MultiByteToWideChar преобразует мультибайтовые символы строки в «широкобайтовые». Обратное преобразование выполняет функция WideCharToMultiByte.

Все символы в Unicode представлены 16-битными значениями (по 2 байта на каждый). В них нет особых байтов, указывающих, чем является следующий байт – частью того же символа или новым символом. Это значит, что прохождение по строке реализуется простым увеличением или уменьшением значения указателя. Unicode позволяет кодировать 65 536 символов.

Для использования Unicode-строк в библиотеки C++ были введены некоторые новые типы данных. Стандартный заголовочный файл String.h модифицирован: в нем определен wchar_t — тип данных, для Unicode-символа:

typedef unsigned short wchar_t;

Список строковых функций ANSI С++ и эквивалентных им Unicode-функций.

  1. char * strcat(char *, const char *);

wchar_t * wcscat(wchar_t *, const wchar_t *);

  1. char * strchr(const char *, int);

wchar_t * wcschr(const wchar_t *, wchar_t),

  1. int strcmp(const char *, const char *,

int wcscmp(const wchar_t *, const wchar_t *);

  1. char * strcpy(char *, const char *),

wchar_t * wcscpy(wchar_t *, const wchar_t *),

  1. size_t strlen(const char *),

size_t wcslen(const wchar_t *),

Имена всех Unicode-функций начинаются с wcs — это аббревиатура wide character set (набор широких символов).