
- •Оглавление
- •1 Простейшее Win32 приложение
- •2 Функция WinMain
- •3 Оконный класс
- •4 Стили класса, стили окна
- •5 Создание экземпляра оконного класса
- •6 Динамические изменения свойств оконного класса
- •7 Обработка сообщений
- •8 Программирование клавиатуры
- •9 Коды oem, ansii, asci, виртуальные коды клавиш
- •10 Символьные сообщения
- •11 Обработка сообщений от мыши
- •12 Программирование таймера
- •13 Диалоговые окна
- •14 Структура шаблона диалога
- •14(А) Ресурсы диалога
- •15 Функции создания диалога
- •16 Взаимодействие между элементами управления
- •17 Сообщения, SendMessage, SendDlgItemMessage
- •18 Обработка сообщений от элементов диалога
- •19 Элемент «Слайдер» (Румянцев - Азбука программирования в Win32 api, c.148)
- •20 Элемент ProgressBar (Румянцев - Азбука программирования в Win32 api, c.156)
- •21 Bios (общие сведения)
- •22 Файлы (общие сведения)
- •23 Создание файла (Win32 api)
- •24 Операции с файлом (Win32 api)
- •25 Организация файлов
- •26 Файловые системы (общие сведения)
- •Создание файла.
- •Удаление файла.
- •28 Структура логического диска под fat12 (wfat)
- •29 Каталоги в fat12
- •30 Алгоритм определения расположения файлов на диске
- •31 Ф.С. Fat32 (отличительные особенности)
- •32 Изменение элементов системных объектов при выполнении copy
- •33 Ntfs (общие сведения)
- •34 Запись файла в mft
- •35 Метафайлы
- •36 Атрибуты записи файла
- •37 Изменение системных данных при выполнении copy
- •38 Изменение системных данных при выполнении del
- •39 Изменение системных данных при выполнении move
- •40 Процессы. Потоки. Общие сведения
- •41 Модель процесса
- •42 Контекст процесса
- •43 Дескриптор процесса
- •44 Создание процесса (общие сведения)
- •45 Окончание процесса (общие сведения)
- •46 Состояния процесса
- •47 Уровни планирования процессов
- •48 Диспетчеризация процессов
- •49 Класс приоритета процесса
- •50 Создание процесса (Win32 api)
- •51 Win32 Api. Управление процессами
- •52 Win32 Api. Окончание процесса
- •53 Среда процесса
- •54 Командная строка процесса
- •55 Наследование дочерними процессами ресурсов родителя
- •56 Список процессов
- •57 Время выполнения процесса
Оглавление
1 Простейшее Win32 приложение 2
2 Функция WinMain 4
3 Оконный класс 5
4 Стили класса, стили окна 5
5 Создание экземпляра оконного класса 7
6 Динамические изменения свойств оконного класса 7
7 Обработка сообщений 12
8 Программирование клавиатуры 13
9 Коды OEM, ANSII, ASCI, виртуальные коды клавиш 18
10 Символьные сообщения 22
11 Обработка сообщений от мыши 23
12 Программирование таймера 25
13 Диалоговые окна 25
14 Структура шаблона диалога 26
14(а) Ресурсы диалога 27
15 Функции создания диалога 29
16 Взаимодействие между элементами управления 29
17 Сообщения, SendMessage, SendDlgItemMessage 34
18 Обработка сообщений от элементов диалога 37
19 Элемент «Слайдер» (Румянцев - Азбука программирования в Win32 API, c.148) 37
20 Элемент ProgressBar (Румянцев - Азбука программирования в Win32 API, c.156) 40
21 BIOS (общие сведения) 43
22 Файлы (общие сведения) 43
23 Создание файла (Win32 API) 43
24 Операции с файлом (Win32 API) 44
25 Организация файлов 45
26 Файловые системы (общие сведения) 45
27 Ф.С. FAT12 47
28 Структура логического диска под FAT12 (WFAT) 50
29 Каталоги в FAT12 53
30 Алгоритм определения расположения файлов на диске 53
31 Ф.С. FAT32 (отличительные особенности) 53
32 Изменение элементов системных объектов при выполнении COPY 54
33 NTFS (общие сведения) 54
34 Запись файла в MFT 54
35 Метафайлы 55
36 Атрибуты записи файла 56
37 Изменение системных данных при выполнении COPY 58
38 Изменение системных данных при выполнении DEL 58
39 Изменение системных данных при выполнении MOVE 58
40 Процессы. Потоки. Общие сведения 59
41 Модель процесса 59
42 Контекст процесса 60
43 Дескриптор процесса 61
44 Создание процесса (общие сведения) 61
45 Окончание процесса (общие сведения) 61
46 Состояния процесса 61
47 Уровни планирования процессов 62
48 Диспетчеризация процессов 63
49 Класс приоритета процесса 64
50 Создание процесса (Win32 API) 65
51 Win32 Api. Управление процессами 67
52 Win32 Api. Окончание процесса 68
53 Среда процесса 69
54 Командная строка процесса 70
55 Наследование дочерними процессами ресурсов родителя 71
56 Список процессов 72
57 Время выполнения процесса 73
1 Простейшее Win32 приложение
Windows поддерживает два типа приложений: основанные на графическом интерфейсе и консольные. У приложений первого типа внешний интерфейс чисто графический. GUI-приложения создают окна, имеют меню, взаимодействуют с пользователем через диалоговые окна и вообще пользуются всей стандартной "Windows'овской" начинкой. Почти все стандартные программы Windows — Notepad, Calculator, Wordpad и др. — являются GUI-приложениями. Приложения консольного типа работают в текстовом режиме: они не формируют окна, не обрабатывают сообщения и не требуют GUI. И хотя консольные приложения на экране тоже размещаются в окне, в нем содержится только текст. Командные процессоры вроде Cmd.exe (в Windows 2000) или Command.com (в Windows 98) — типичные образцы подобных приложений.
Во всех Windows-приложениях должна быть входная функция за реализацию которой отвечаете Вы. Существует четыре такие функции:
int WINAPI WinMain( HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nCmdShow);
int WINAPI wWinMain( HINSTANCE hinstExe, HINSTANCE, PWSTR pszCmdLine, int nCmdShow);
int __cdecl main( int argc, char *argv[], char *envp[]);
int _cdecl wmain( int argc, wchar_t *argv[], wchar_t *envp[]);
На самом деле входная функция операционной системой не вызывается. Вместо этого происходит обращение к стартовой функции из библиотеки С/С++. Она инициализирует библиотеку С/С++, чтобы можно было вызывать такие функции, как malloc и free, а также обеспечивает корректное создание любых объявленных Вами глобальных и статических С++-объектов до того, как начнется выполнение Вашего кода.
В следующей таблице показано, в каких случаях реализуются те или иные входные функции.
Тип приложения |
Входная функция |
Стартовая функция, встраиваемая в Ваш исполняемый файл |
GUI-приложение, работающее с ANSI-символами и строками |
WinMain |
WinMainCRTStartup |
GUI-приложение, работающее с Unicode-символами и строками |
wWinMain |
wWinMainCRTStartup |
CUI-приложение, работающее с ANSI-символами и строками |
main |
mainCRTStartup |
CUI-приложение, работающее с Unicode-символами и строками |
wmain |
wmainCRTStartup |
Нужную стартовую функцию в библиотеке С/С++ выбирает компоновщик при сборке исполняемого файла. Если указан ключ /SUBSYSTEM:WINDOWS, компоновщик ищет в Вашем коде функцию WinMain или wWinMain. Если ни одной из них нет, он сообщает об ошибке "unresolved external symbol" ("неразрешенный внешний символ"); в ином случае — выбирает WinMainCRTStartup или wWinMainCRTStartup соответственно.
Все стартовые функции из библиотеки С/С++ делают практически одно и то же. Разница лишь в том, какие строки они обрабатывают (в ANSI или Unicode) и какую входную функцию вызывают после инициализации библиотеки. Кстати, с Visual C++ поставляется исходный код этой библиотеки, и стартовые функции находятся в файле CRt0.c. А теперь рассмотрим, какие операции они выполняют:
считывают указатель на полную командную строку нового процесса;
считывают указатель на переменные окружения нового процесса;
инициализируют глобальные переменные из библиотеки С/С++, доступ к которым из Вашего кода обеспечивается включением файла StdLib.h. Список этих переменных приведен в таблице 4-1;
инициализируют кучу (динамически распределяемую область памяти), используемую С-функциями выделения памяти (т.е. malloc и calloc) и другими процедурами низкоуровневого ввода-вывода;
вызывают конструкторы всех глобальных и статических объектов С++-классов.
Закончив эти операции, стартовая функция обращается к входной функции в Вашей программе. Если Вы написали ее в виде wWinMain, то она вызывается так:
GetStartupInfo(&StartupInfo);
int nMainRetVal = wWinMain(GetModuleHandle(NULL),
NULL,
pszCommandLineUnicode,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW) ?
StartupInfo.wShowWindow : SW_SHOWDEFAULT);
А если Вы предпочли WinMain, то:
GetStartupInfo(&StartupInfo);
int nMainRetVal = WinMain(GetModuleHandle(NULL),
NULL,
pszCommandLineANSI,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW) ?
StartupInfo.wShowWindow : SW_SHOWDEFAULT);
И, наконец, то же самое для функций wmain и main.
int nMainRetVal = wmain(__argc, __wargv, _wenviron};
int nMainRetVal = main(_argc, __argv, _environ);