Уроки Iczelion'а



         

Урок 13: Memory Mapped файлы - часть 6


invoke EnableMenuItem,hMenu,IDM_OPEN,MF_GRAYED invoke EnableMenuItem,hMenu,IDM_SAVE,MF_ENABLED

В качестве предосторожности, мы не хотим чтобы пользователь мог открыть несколько файлов за pаз, поэтому делаем пункт меню Open недоступным для выбора и делаем доступным пункт Save.

EnableMenuItem используется для изменения атрибутов пункта меню.

После этого, мы ждем, пока пользователь выберет File/Save или закроет программу.

.ELSEIF uMsg==WM_DESTROY

.if hMapFile!=0 call CloseMapFile .endif invoke PostQuitMessage,NULL

В выше приведенном коде, когда процедура окна получает сообщение WM_DESTROY, она сначала проверяет значение hMaрFile - равно ли то нулю или нет. Если оно не pавно нулю, она вызывает функцию CloseMapFile, которая содержит следующий код:

CloseMapFile PROC invoke CloseHandle,hMapFile mov hMapFile,0 invoke CloseHandle,hFileRead

ret CloseMapFile endp

CloaseMaрFile закрывает MMF и сам файл, так что наша программа не оставляет за собой следов при выходе из Windows. Если пользователь выберет сохранение информации в другой файл, программа покажет ему окно сохранения файла. После он сможет напечать имя нового файла, который и будет создать функцией CreateFile.

invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0 mov pMemory,eax

Сpазу же после создания выходного файла, мы вызываем MapViewOfFile, чтобы промэппировать желаемую порцию MMF в память. Эта функция имеет следующий синтаксис:

MapViewOfFile proto hFileMappingObject:DWORD,\ dwDesiredAccess:DWORD,\ dwFileOffsetHigh:DWORD,\ dwFileOffsetLow:DWORD,\ dwNumberOfBytesToMap:DWORD

dwDesiredAccess specifies what operation we want to do to the file. In our example, we want to read the data only so we use FILE_MAP_READ. dwFileOffsetHigh and dwFileOffsetLowspecify the starting file offset of the file portion that you want to map into memory. In our case, we want to read in the whole file so we start mapping from offset 0 onwards.

dwDesiredAccess определяет, какую операцию мы хотим совершить над файлом. В нашем примере мы хотим только прочитать данные, поэтому мы используем FILE_MAP_READ.




Содержание  Назад  Вперед