- •История Windows
- •Windows 1.0
- •Windows 1.3
- •Windows 2.0
- •Windows 3.0
- •Windows 3.1
- •Windows for Workgroups версии 3.11
- •Windows NT
- •Windows 95
- •Windows NT Workstation 4.0 и Windows NT Server 4.0
- •Windows NT 4.0 Server Enterprise Edition
- •Windows 98
- •Windows 98 Second Edition (SE)
- •Windows 2000
- •Windows 98 Millenium Edition (ME)
- •Windows XP
- •Общая архитектура WINDOWS приложения.
- •Каркас приложения
- •Регистрация класса окна
- •Создание окна.
- •Отображение окна.
- •Цикл обработки очереди сообщений.
- •WndProc
- •Обработка сообщений типового приложения.
- •Контрольные вопросы
- •Сообщения
- •Типы сообщений
- •Обработка клавиатурных сообщений
- •Обработка сообщений от мыши
- •Сообщения таймера
- •Контрольные вопросы
- •Организация ввода
- •Разупорядоченный ввод
- •Разделение потоками виртуальных очередей ввода
- •Локальное состояние ввода
- •Ввод с клавиатуры и фокус
- •Управление курсором мыши
- •Контрольные вопросы
- •Окна
- •Окна Windows
- •Иерархия окон
- •Оконная процедура, стандартные оконные процедуры
- •Стиль класса окна
- •Стили окон, окна основных стилей
- •Перекрывающиеся окна
- •Временные окна
- •Дочерние окна
- •Сообщения управления окнами
- •Окна с полосами прокрутки
- •Системные метрики
- •Определение размера окна
- •Определение расположения окна
- •Контрольные вопросы
- •Графический интерфейс устройств(GDI).
- •Создание (получение) контекста устройств.
- •Сохранение контекста устройства.
- •Прямые (отрезки) и кривые
- •Закрашенные области
- •Битовые шаблоны (растровые шаблоны, растровые образы)
- •Текст и шрифты
- •Режимы масштабирования и преобразования
- •Метафайл
- •Регионы
- •Путь
- •Палитры
- •Контрольные вопросы
- •Объекты ядра
- •Что такое объект ядра
- •Учет пользователей объектов ядра
- •Защита
- •Таблица описателей объектов ядра
- •Создание объекта ядра
- •Закрытие объекта ядра
- •Синхронизация объектов
- •Именованные объекты
- •Дублирование описателей объектов
- •Изменение флагов описателя
- •Синхронизация потоков
- •Критическая секция
- •Мьютексы
- •Семафоры
- •События
- •Ожидаемые таймеры
- •Контрольные вопросы
- •Ресурсы Windows приложения
- •Файлы ресурсов приложения
- •Значки (пиктограммы)
- •Курсоры
- •Битовые образы
- •Символьные строки
- •Ресурсы, определяемые пользователем
- •Таблица акселераторов
- •Меню
- •Диалоговые окна
- •Контрольные вопросы
- •Элементы управления
- •Дочерние окна управления
- •Создание дочерних окон
- •Сообщения дочерних окон родительскому окну
- •Сообщения родительского окна дочерним окнам
- •Дочерние окна и фокус ввода
- •Дочерние окна управления и цвет
- •Кнопки различных стилей (класс BUTTON)
- •Нажимаемые кнопки
- •Флажки-переключатели
- •Переключатели
- •Окна групп
- •Кнопки, определяемые пользователем
- •Статические поля (класс static)
- •Текстовые редакторы (класс edit)
- •Списки разных стилей (класс listbox)
- •Комбинированные списки (класс combobox)
- •Полосы прокрутки (класс scrollbar)
- •Контрольные вопросы
- •Расширенные элементы управления
- •Основы общих элементов управления
- •Инициализация библиотеки элементов общего пользования
- •Создание элементов управления общего пользования
- •Посылка сообщений общим элементам управления
- •Уведомляющие сообщения от общих элементов управления
- •Контрольные вопросы
- •Стандартные диалоговые окна.
- •Окна сообщений
- •Диалоговые окна общего пользования
- •Контрольные вопросы
- •Динамически подключаемые библиотеки
- •Создание DLL
- •Проецирование DLL на адресное пространство процесса
- •Функция входа/выхода
- •Функция DllMain и стандартная библиотека С
- •Функция LibEntry
- •Функция LibMain
- •Функция WEP
- •Экспорт функций и переменных из DLL
- •Импорт функций и переменных из DLL
- •Заголовочный файл DLL
- •Разделы в ЕХЕ- и DLL-файлах
- •Контрольные вопросы
- •Файлы, проецируемые в память
- •Контрольные вопросы
- •Классы, определяющие архитектуру приложения
- •Классы приложения и поддержки потоков
- •Классы приложения и потоков
- •Классы фреймов окон
- •Получение информации о приложении
- •Соглашения об именах MFC
- •Включаемые файлы
- •Функция WinMain
- •Класс CWinApp
- •Класс CWnd
- •Класс CFrameWnd
- •Создание главного окна SDI-приложения
- •Примечание
- •Создание главного окна SDI-приложения
- •Создание дочерних окон
- •Ограничение размеров окна
- •Ограничение доступа к окну
- •Создание многодокументных приложений
- •Класс CMDIChildWnd
- •MDI — пример приложения
- •Категории сообщений
- •Карта сообщений
- •Компоненты карты сообщений
- •Класс CCmdTarget
- •Стандартный маршрут команды
- •Команды обновления и класс CCmdlll
- •Функции для работы с сообщениями
- •Основные положения
- •Класс CDocTemplate
- •Класс CSingleDocTemplate
- •Роль фреймов в архитектуре "документ/представление"
- •Документ и его представления
- •Документы
- •Класс CDocument
- •Класс CArchive
- •Представления
- •Класс CView
- •Панели элементов управления
- •Класс CStatusBar
- •Класс CStatusBarCtrl
- •Класс CDialogBar
- •ControlBars — пример приложения
- •НЕКОТОРЫЕ КЛАССЫ MFC
- •Класс CObject - основной класс MFC
- •Конструкторы класса
- •Оператор присваивания
- •Диагностика
- •Проверка целостности объектов класса
- •Получение дампа объекта класса
- •Сохранение и восстановление состояния объекта
- •Метод IsSerializable
- •Виртуальный метод Serialize
- •Информация о классе
- •Виртуальный метод GetRuntimeClass
- •Метод IsKindOf
- •Класс CPoint - точка на плоскости
- •Класс CSize - относительные координаты
- •Класс CString - текстовые строки
- •Конструктор класса
- •Коллекции
- •Массивы - шаблон CArray
- •Списки - шаблон CList
- •Словари - шаблон CMap
- •Класс CTime - дата и время
- •Файловая система - класс CFile
- •Открытие и создание файлов
- •Идентификатор открытого файла
- •Закрытие файлов
- •Чтение и запись файлов
- •Метод Flush
- •Операции с файлами
- •Блокировка
- •Позиционирование
- •Характеристики открытого файла
- •Файловая система - классы CMemFile и CStdioFile
- •Модификация класса CMemFile
- •Файловая система - класс CStdioFile
- •Запись и восстановление объектов
- •Запись в архивный файл
- •Чтение из архивного файла
- •Исключения - класс CException
- •Класс CException
- •Класс CMemoryException
- •Класс CFileException
- •Приложение Except
- •Класс CArchiveException
- •Класс CNotSupportedException
- •Класс CResourceException
- •Класс CUserException
14.Следует ли освобождать контекст класса окна после его получения?
15.Когда желательно использовать контекст класса окна?
16.Можно ли для контекста класса окна выполнять настройку большинства атрибутов всего один раз?
17.Какие атрибуты контекста класса окна обязательно следует настраивать после его получения?
18.Когда используется личный контекст? В преимущества и недостатки его использования?
19.Кем используется и что позволяет делать родительский контекст?
20.Какой контекст позволяет осуществлять вывод в нерабочую область окна? Как его получить?
21.Как можно получить информацию об устройстве вывода? Контекст какого типа следует для этого использовать?
22.Какой контекст применятся для представления растрового изображения в памяти? С кем должен быть совместим этот контекст? Как создается такой контекст?
23.Что такое метафайл? Что он позволяет делать? Как получить его контекст?
24.При помощи какого контекста осуществляется вывод изображений на такое устройство, как, например, принтер?
25.При помощи какого контекста приложение может рисовать на всей поверхности экрана?
26.Какие объекты GDI приложение может создавать и использользовать в процессе своей работы?
27.Какова последовательность действий, выполняемых приложением, использующим объекты GDI?
28.Что необходимо сделать для того, чтобы функции отрисовки могли использовать тот или иной объект GDI?
29.Что такое предопределенные системой объекты GDI? Как приложение может получить к ним доступ?
30.Для чего применяются перья? Каким образом их можно создавать и использовать?
31.Что такое режим смешивания переднего плана, на что он влияет?
32.Что такое режим фона и цвет фона, что они определяют?
33.Для чего используются кисти? Какие кисти может создать приложение?
34.Что такое начало отсчета кисти? Для чего используется этот атрибут?
35.Как приложение может создать свой шрифт, что оно для этого должно указать функции создания шрифта?
36.Каковы основные моменты работы с растровыми изображениями?
37.Для чего используется технология отсечения?
38.Какую форму может иметь область отсечения?
Объекты ядра
Эти объекты используются системой и нашими приложениями для управления множеством самых разных ресурсов: процессами, потоками, файлами и т.д.
Что такое объект ядра
(!!!)Система позволяет создавать и оперировать с несколькими типами объектов:
•маркерами доступа (access token objects);
•файлами (file objects);
•проекциями файлов (file-mapping objects);
•портами завершения ввода-вывода (I/O completion port objects);
•заданиями (job objects);
•почтовыми ящиками (mailslot objects);
•мьютексами (mutex objects);
•каналами (pipe objects);
•процессами (process objects);
•семафорами (semaphore objects);
•потоками (thread objects);
•ожидаемыми таймерами (waitable timer objects);
•событиями (event);
•критическими секциями (critical section);
•уведомлениями об изменениях на диске (change notification);
•кучами (heap);
•подгружаемыми модулями (module) DLL;
•сокетами (socket).
Эти объекты создаются Windows-функциями. Например, CreateFileMapping
заставляет систему сформировать объект "проекция файла". Каждый объект ядра — блок памяти, выделенный ядром и доступный только ему. Этот блок представляет собой структуру данных, в элементах которой содержится информация об объекте.
Некоторые элементы (дескриптор защиты, счетчик числа пользователей и др.) присутствуют во всех объектах, но большая их часть специфична для объектов конкретного типа. Например, у объекта "процесс" есть идентификатор, базовый приоритет и код завершения, а у объекта "файл" — смещение в байтах, режим разделения и режим открытия.
Поскольку структуры объектов ядра доступны только ядру, приложение не может самостоятельно найти эти структуры в памяти и напрямую модифицировать их содержимое. Такое ограничение Microsoft позволяет:
•ни какой программе не нарушать целостность структур объектов ядра;
•вводить, убирать или изменять элементы структур, не нарушая работы каких-либо приложений.
В Windows предусмотрен набор функций, обрабатывающих структуры объектов ядра по строго определенным правилам. Доступ к объектам ядра происходит только через эти функции.
•вызывая функцию, создающую объект ядра, она возвращает описатель,
идентифицирующий созданный объект. Описатель следует рассматривать как "непрозрачное" значение, которое может быть использовано любым потоком процесса.
•этот описатель передается Windows-функциям, сообщая системе, какой объект ядра Вас интересует.
Учет пользователей объектов ядра
Объекты ядра принадлежат ядру, а не процессу. Иначе говоря, если процесс вызывает функцию, создающую объект ядра, а затем завершается, объект ядра может быть не разрушен. В большинстве случаев такой объект все же разрушается; но если созданный объект ядра используется другим процессом, ядро запретит разрушение объекта до тех пор, пока от него не откажется и тот процесс.
Ядру известно, сколько процессов использует конкретный объект ядра, поскольку в каждом объекте есть счетчик числа его пользователей. Этот счетчик — один из элементов данных, общих для всех типов объектов ядра. В момент создания объекта счетчику присваивается 1. Когда к существующему объекту ядра обращается другой процесс, счетчик увеличивается на 1. А когда какой-то процесс завершается, счетчики всех используемых им объектов ядра автоматически уменьшаются на 1. Как только счетчик какого-либо объекта обнуляется, ядро уничтожает этот объект.
Защита
Объекты ядра можно защитить дескриптором защиты (security descriptor),
который описывает, кто создал объект и кто имеет права на доступ к нему. Дескрипторы защиты обычно используют при написании серверных приложений; создавая клиентское приложение, Вы можете игнорировать это свойство объектов ядра.
Почти все функции, создающие объекты ядра, принимают указатель на структуру SECURITY_ATTRIBUTES как аргумент, например:
HANDLE |
CreateFileMapping( |
HANDLE |
hFile, |
PSECURITY_ATTRIBUTES |
psa, |
DWORD |
flProtect, |
DWORD |
dwMaximumSizeHigh, |
DWORD |
dwMaximumSizeLow, |
PCTSTR pszName); |
|
Большинство приложений вместо этого аргумента передает NULL и создает объект с защитой по умолчанию. Такая защита подразумевает, что создатель объекта и любой член группы администраторов получают к нему полный доступ, а все прочие к
объекту не допускаются. Однако Вы можете создать и инициализировать структуру SECURITY_ATTRIBUTES, а затем передать ее адрес. Она выглядит так:
typedef struct _SECURITY_ATTRIBUTES { DWORD nLength,
LPVOID lpSecurityDescriptor; BOOL bInheritHandle;
} SECURITY_ATTRIBUTES;
Хотя структура называется SECURITY_ATTRIBUTES, лишь один её элемент имеет отношение к защите — lpSecurityDescriptor. Если надо ограничить доступ к
созданному Вами объекту ядра, создайте дескриптор защиты и инициализируйте структуру SECURITY_ATTRIBUTES следующим образом:
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa); |
// используется для выяснения версий |
sa.lpSecurityDescriptor = pSD, // адрес инициализированной SD |
|
sa.bInheritHandle = FALSE; |
// об этом позже |
HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, |
|
PAGE_READWRITE, 0, 1024, "MyFileMapping"); |
Желая получить доступ к существующему объекту ядра (вместо того чтобы создавать новый), следует указать, какие операции Вы намерены проводить над объектом. Например, если считывать данные из существующей проекции файла, то надо вызвать функцию OpenFileMapping таким образом:
HANDLE hFileMapping = OpenFileMapping(FILE_MAP_READ, FALSE, "MyFileMapping");
Передавая FILE_MAPREAD первым параметром в функцию OpenFileMapping,
вы сообщаете, что, как только Вам предоставят доступ к проекции файла, вы будете считывать из нее данные. Функция OpenFileMapping, прежде чем вернуть