- •§ 1.2. Основы программирования в ос Windows
- •1.2.1. Принципы взаимодействия ос Windows с прикладными программами
- •1.2.2. Типы данных в Windows
- •1.2.3. Графический и консольный интерфейс
- •1.2.4. Создание элементарного графического окна
- •Int nCmdShow)
- •Общие черты.
- •§ 1.3. Принципы разработки динамических библиотек
- •1.3.1. Основные положения
- •1.3.2. Главная функция DllMain()
- •If(bAll WentWell)
- •1.3.3. Экспортирование функций из dll
- •Int sharedInts[10] ;
1.2.2. Типы данных в Windows
В Windows-программах не слишком широко применяются стандартные типы данных из С или С++, такие как int или char*. Вместо них используются типы данных, определенные в различных библиотечных (header) файлах. Наиболее часто используемыми типами являются [11]: HANDLE, HWND, BYTE, WORD, DWORD, UNIT, LONG, BOOL, LPSTR и LPCSTR.
Тип HANDLE обозначает 32-разрядное целое, используемое в качестве дескриптора. Есть несколько похожих типов данных, но все они имеют ту же длину, что и HANDLE, и начинаются с литеры Н. Дескриптор – это просто число, определяющее некоторый ресурс.
Тип HWND обозначает 32-разрядное целое – дескриптор окна. В программах, использующих библиотеку MFC, дескрипторы применяются не столь широко, как это имеет место в традиционных программах.
Тип BYTE обозначает 8-разрядное беззнаковое символьное значение.
Тип WORD – 16-разрядное беззнаковое короткое целое.
Тип DWORD – беззнаковое длинное целое.
Тип UINT - беззнаковое 32-разрядное целое.
Тип LONG эквивалентен типу long.
Тип BOOL обозначает целое и используется, когда значение может быть либо ис-тинным, либо ложным.
Тип LPSTR определяет указатель на строку.
Тип LPCSTR – константный (const) указатель на строку.
1.2.3. Графический и консольный интерфейс
В Windows поддерживается два типа приложений: основанные на графическом интерфейсе (graphical user interface, GUI) и консольные (console user interface, CUI) У приложений первого типа внешний интерфейс чисто графический - создаются окна, меню, диалоговые окна и т.д. Почти все стандартные программы Windows и большинство пользовательских программ являются GUI - приложениями. Приложения консольного типа работают в текстовом режиме: они не формируют окна, не обрабатывают сообщения, но на экране тоже размещаются в окне, правда черного цвета и могут вызывать диалоговые окна.
Все Windows-программы, написанные на языке C++ начинают выполнение с вызова функции входа. В среде Win32 существует четыре модификации таких функций:
int WINAPI WinMain(
HINSTANCE hInstance, //дескриптор, присваиваемый запущенному приложению
HINSTANCE hPrevInstance, //для совместимости с win16, в win32 не используется
LPSTR lpCmdLine, //указатель на командную строку, если приложение так запущено
int nCmdShow ); //значение, которое может быть передано в функцию ShowWindow()
int WINAPI wWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow);
int _ _cdecl main( int argc, //количество аргументов, переданных в командной строке
char *argv[], //массив размером argc с указателями на ANSI-строки.
//Каждый элемент массива указывает на один из аргументов командной строки
char *envp[] ); //массив указателей на ANSI-строки. Каждый элемент массива
// указывает на строку - переменную окружения (область памяти,
// выделенная в адресном пространстве процесса)
int _ _cdecl wmain( int argc, //количество аргументов, переданных в командной строке
wchar_t *argv[], //массив размером argc с указателями на UNICODE-строки.
//Каждый элемент массива указывает на один из аргументов командной строки
wchar_t *envp[] );//массив указателей на UNICODE-строки. Каждый элемент массива
//указывает на строку - переменную окружения (область памяти, выделенная
//в адресном пространстве процесса)
Первые две функции используются при разработке приложения с графическим интерфейсом (GUI), две другие - при консольном (CUI). Приставка w перед названием функции показывает, что функция используется для работы с Unicode - строками, обычные функции работают с ANSI - строками. На самом деле входная функция операционной системой не вызывается, вместо этого происходит обращение к стартовой функции из библиотеки С/С++. Она инициализирует библиотеку С/С++, а также обеспечивает корректное создание любых объявленных глобальных и статических объектов до того, как начнется выполнение программного кода. В таблице 1.1 показано, в каких случаях реализуются различные функции входа [7].
В целом все стартовые функции выполняют следующие однотипные задачи:
считывают указатель на полную командную строку нового процесса;
считывают указатель на переменные окружения нового процесса;
инициализируют глобальные переменные из библиотеки С/С++
инициализируют кучу (динамически распределяемую область памяти), используе-мую С-функциями выделения памяти (malloc, calloc) и другими процедурами низко-уровневого ввода-вывода;
вызывают конструкторы всех глобальных и статических объектов С++-классов.
Закончив эти операции, стартовая функция обращается к функции входа.
