Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Razoryonov_2008_full.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.34 Mб
Скачать

Оглавление

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);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]