Для открытия файла предназначена функция mmioOpen , прототип которой есть в файле mmsystem.h. Эта функция может открывать файл для буферизованного или небуферизованного ввода, файл в оперативной памяти. Она может работать с файлами, уже открытыми средствами MS-DOS или использовать дополнительные функции для выполнения нестандартных процедур ввода/вывода. Из-за ограниченного объема книги мы сможем рассмотреть только основные возможности функции mmioOpen, более подробное описание вы сможете найти в документации, которая поставляется вместе с Microsoft SDK. Функция mmioOpen HMMIO mmioOpen( LPSTR szFilename, // путь к файлу LPMMIOINFO lpmmioinfo, // указатель на структуру MMIOINFO DWORD dwOpenFlags); // флаги для операции открытия
Параметры функции: szFilename
Дальний указатель на текстовую строку, содержащую путь к открываемому файлу lpmmioinfo
Указатель на структуру MMIOINFO, которая содержит дополнительные параметры для операции открытия файла. Может быть задан как NULL
Флаги, определяющие режим открытия файла
Возвращаемое значение:
При успехе возвращается идентификатор открытого файла. Этот идентификатор можно использовать только в функциях с префиксом имени mmio. В случае ошибки возвращается значение NULL. Код ошибки можно определить из поля wErrorRet структуры MMIOINFO
Формат структуры MMIOINFO описан в файле mmsystem.h: typedef struct _MMIOINFO { // Поля общего назначения DWORD dwFlags; // общий флаг состояния FOURCC fccIOProc; // код идентификации // процедуры ввода/вывода LPMMIOPROC pIOProc; // указатель на процедуру ввода/вывода UINT wErrorRet; // код завершения HTASK htask; // идентификатор локальной процедуры // ввода/вывода // Поля для буферизованного ввода/вывода LONG cchBuffer; // размер буфера или 0L HPSTR pchBuffer; // начало буфера или NULL HPSTR pchNext; // указатель на следующий байт для // чтения или записи HPSTR pchEndRead; // указатель на последний прочитанный // байт HPSTR pchEndWrite;// указатель на последний // записанный байт LONG lBufOffset; // дисковое смещение начала буфера // Поля для процедур ввода/вывода LONG lDiskOffset; // дисковое смещение для следующей // операции чтения или записи DWORD adwInfo[3]; // дополнительные данные для типа MMIOPROC // Прочие поля DWORD dwReserved1; // зарезервировано DWORD dwReserved2; // зарезервировано HMMIO hmmio; // идентификатор открытого файла } MMIOINFO; typedef MMIOINFO *PMMIOINFO; typedef MMIOINFO NEAR *NPMMIOINFO; typedef MMIOINFO FAR *LPMMIOINFO;
Структура MMIOINFO позволяет задать многочисленные способы работы с файлами. Можно использовать файлы в памяти, можно определить собственную процедуру для выполнения нестандартного ввода или вывода или работать с идентификаторами файлов, открытых средствами MS-DOS. В простых случаях вы можете указать второй параметр функции mmioOpen как NULL и не использовать структуру MMIOINFO вообще: hmmio = mmioOpen((LPSTR)lpszFileName, NULL, MMIO_READ | MMIO_ALLOCBUF);
Последний параметр функции mmioOpen предназначен для определения режима открытия файла в виде логической комбинации ИЛИ отдельных флагов. Приведем список флагов.
Флаг | Описание режима открытия файла |
MMIO_READ | Чтение |
MMIO_WRITE | Запись |
MMIO_READWRITE | Чтение и запись |
MMIO_CREATE | Создание нового файла. Если файл с таким именем уже есть, он обрезается до нулевой длины |
MMIO_DELETE | Удаление файла. Если удаление выполнено без ошибок, возвращается значение TRUE, в противном случае - FALSE |
MMIO_PARSE | Создание текстовой строки, содержащей полный путь к файлу на базе пути, переданного функции через параметр szFilename. Результат помещается обратно в буфер szFilename |
MMIO_EXIST | Определяется, существует ли указанный файл, и если существует, для него создается текстовая строка, содержащая полный путь к файлу |
MMIO_ALLOCBUF | Файл будет открыт для буферизованного ввода/вывода. По умолчанию буфер имеет размер 8 Кбайт. Приложение может изменить размер буфера, указав его в поле cchBuffer в структуре MMIOINFO |
MMIO_COMPAT | Файл будет открыт в режиме совместимости. В этом режиме он может быть открыт несколько раз |
MMIO_EXCLUSIVE | Файл будет открыт в монопольном режиме |
MMIO_DENYWRITE | Другим приложениям запрещено открывать файл на запись |
MMIO_DENYREAD | Другим приложениям запрещено открывать файл на чтение |
MMIO_DENYNONE | Другие приложения могут открывать файл и на запись, и на чтение |
MMIO_GETTEMP | Создание текстовой строки для открытия временного файла. Текстовая строка будет записана в буфер, адрес которого передается через первый параметр. Открытие файла не выполняется |
В следующем фрагменте кода выполняется создание файла, который открывается и на запись, и на чтение: hFile = mmioOpen(szFileName, NULL, MMIO_CREATE | MMIO_READWRITE);