- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
- •Часть 1. Теоретические сведения4
- •Часть 2. Лабораторный практикум73
- •Часть 1 Теоретические сведения
- •1. Основы архитектурЫ защищенного режима Регистры процессора
- •Адресация памяти
- •2. Логические шрифты Создание логических шрифтов
- •Вывод на экран текстовых строк
- •3. Таймеры Windows Организация и обслуживание таймеров
- •Мультимедийные таймеры
- •Измерение интервалов времени
- •Организация периодического процесса
- •Задание однократного интервала времени
- •4. Дочерние окна Создание и использование дочерних окон
- •Окна предопределенных классов в главном окне
- •5. Вывод растровых изображений
- •Процедура вывода растрового изображения
- •Компоновка составных изображений
- •6. Обслуживание файлов в 32-разрядных приложениях Windows
- •Базовые операции с файлами Открытие и создание файла
- •Запись и чтение файла
- •Файлы, проецируемые в память
- •7. Процессы и потоки
- •Создание дочернего процесса
- •Создание дочернего потока
- •Синхронизация потоков Общие характеристики объектов Windows
- •Синхронизация с помощью состояний потока
- •Синхронизация с помощью событий
- •Критические секции и защита данных
- •8. Библиотеки динамической компоновки
- •Часть 2 Лабораторный практикум Работы лабораторного практикума Работа 1. Создание логических шрифтов
- •Работа 2. Таймеры Windows(индивидуальное задание а)
- •Работа 3. Дочернее окно в главном окне приложения
- •Работа 4. Вывод растровых изображений с использованием совместимой памяти
- •Работа 5. Измерение временных характеристик программы с помощью мультимедийного таймера
- •Работа 6. Вывод движущихся изображений с синхронизацией от системного таймера (индивидуальное задание b)
- •Работа 7. Повышение качества движущихся изображений с помощью совместимой памяти
- •Работа 8. Движение изображения по фоновому рисунку
- •Работа 9. Работа с файлами (индивидуальное задание c)
- •Работа 10. Стандартные диалоги Windows для работы с файлами
- •Работа 11. Проецирование файла в память
- •Работа 12. Потоки (индивидуальное задание d)
- •Работа 13. Синхронизация потоков с помощью событий
- •Работа 14. Защита данных с помощью критической секции
- •Работа 15. Библиотеки динамической компоновки
- •Работа 16. Передача параметров в функции dll-библиотек
- •Индивидуальные задания лабораторного практикума
- •Задание c2.Массив записываемых в файл данных должен представлять собой последовательный ряд из 2000 целых четных чисел.
- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
6. Обслуживание файлов в 32-разрядных приложениях Windows
Те или иные операции с файлами используются почти в любом приложении Windows. Действительно, трудно представить себе программу, которая вводит информацию только с клавиатуры и выводит ее только на экран. В этом случае объемы обрабатываемых данных будут невелики, а результаты работы программы недолговечны. Чаще и исходные для программы данные, и данные, полученные в результате ее работы, хранятся на дисках в виде файлов; многие программы по ходу своей работы создают еще и временные файлы для хранения промежуточной информации. При завершении программы эти временные файлы уничтожаются.
Для 32-разрядных приложений системой Windowsпредоставляются как традиционные средства работы с файловой системой (создание и удаление файлов и каталогов, чтение и запись, поиск, изменение характеристик и др.), так и специфические средства, не поддерживаемые в 16-разрядных приложениях Windows или вMS-DOS. К последним прежде всего следует отнести проецирование файлов в память, асинхронные операции с файлами и расширенное толкование понятия физической памяти как суммы оперативной памяти и страничных файлов (файлов подкачки).
Базовые операции с файлами Открытие и создание файла
Перед тем как начать работать с файлом, программа должна либо его создать заново, либо открыть, если он был создан ранее. И та и другая операция выполняются в 32-разрядных приложениях Windows с помощью одной универсальной функции – CreateFile(). При успешном выполнении эта функция возвращает 32-разрядный дескриптор файла типаHANDLE, через который потом и выполняются все операции с данным файлом. Если файл открыть не удалось, функцияCreateFile()возвращает0xFFFFFFFF. ФункцияCreateFile()имеет следующий прототип:
HANDLE CreateFile(
LPCTSTR lpFileName,//Адрес спецификации файла
DWORD dwDesiredAccess,//Режим доступа
DWORD dwShareMode,//Режим разделения
LPSECURITY_ATTRIBUTES lpSecurityAttributes,//Адрес
//структуры с атрибутами защиты
DWORD dwCreationDistribution,//Режим открытия
DWORD dwFlagsAndAttributes,//Атрибуты файла
HANDLE hTemplateFile //Дескриптор файла-шаблона
);
Параметр lpFileNameописывает спецификацию файла по обычным правилам, например"Myfile.001", если файл находится в текущем каталоге, или"C:\\Dir\\1.1", если файл находится в конкретном каталоге конкретного диска. Обратите внимание на обозначение пути к файлу. Поскольку в языке С++ символ “\” является управляющим, то для того чтобы ввести этот символ в символьную строку, например, в качестве разделителя каталогов в составном пути, следует указывать два таких символа. Допустимо также использование для разделения элементов пути одного знака деления:"C:/Dir/1.1"
Параметр dwDesiredAccessпри работе с файлами чаще всего указывается в видеGENERIC_READ | GENERIC_WRITE, что обеспечивает доступ к файлу как для чтения, так и для записи.
Параметр dwShareModeимеет значение в тех случаях, когда к файлу могут одновременно обращаться несколько приложений; если файл будет использоваться в монопольном режиме, на месте этого параметра указывается 0.
Параметр lpSecurityAttributesуказывает на структурную переменную типаSECURITY_ATTRIBUTES, которая позволяет задать атрибуты защиты для данного объекта. Этот параметр имеет смысл, главным образом, в сетевых приложениях; создавая обычную прикладную программу, которая будет выполняться на автономной или локальной машине, на месте этого параметра можно указатьNULL.
Параметр dwCreationDistributionможет принимать следующие значения:
CREATE_NEW– создается новый файл; если файл уже существует, функцияCreateFile()возвращает ошибку;
CREATE_ALWAYS– создается новый файл; если файл с указанным именем уже существует, он затирается вновь создаваемым;
OPEN_EXISTING– открывается существующий файл; если такого файла нет, функцияCreateFile()возвращает ошибку;
OPEN_ALWAYS– открывается существующий файл; если такого файла нет, функцияCreateFile()создает новый файл с указанным именем.
Параметр dwFlagsAndAttributesпозволяет установить атрибуты и некоторые другие специальные характеристики файла. В большинстве случаев эти характеристики значения не имеют, и в качестве этого параметра можно указать 0.
Параметр hTemplateFileможет содержать дескриптор открытого файла-шаблона, атрибуты которого применяются и для вновь создаваемого файла. Обычно в качестве значения этого параметра используетсяNULL.
Таким образом, типичным для прикладной программы будут следующие формы вызова функции CreateFile():
/*При создании нового файла*/
HANDLE hFile=CreateFile("001.dat",
GENERIC_READ|GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, 0, NULL);
/*При открытии существующего файла*/
HANDLE hFile=CreateFile("001.dat",
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
После завершения работы с файлом или перед завершением программы все открытые в ней файлы следует закрыть. Для этого используется функция CloseHandle()c указанием в качестве ее единственного параметра дескриптора закрываемого файла:
CloseHandle(hFile);
Впрочем, в процессе завершения приложения Windows закрывает все созданные им объекты, в частности файлы, так что во многих случаях заботу о закрытии файлов можно возложить на Windows.