Функция Oem2Char (отображение файла на память)
Третий вариант функции Oem2Char, который используется для работы через отображение файла на память, выглядит очень просто. В нем даже нет цикла, а перекодировка выполняется за один прием:
void Oem2Char(HANDLE hSrcFile)
{
DWORD dwFileSize;
HANDLE hFileMapping;
LPVOID lpFileMap;
dwFileSize = GetFileSize(hSrcFile, NULL);
hFileMapping = CreateFileMapping(hSrcFile,
NULL, PAGE_READWRITE, 0, dwFileSize, NULL);
if(hFileMapping == NULL)
return;
lpFileMap = MapViewOfFile(hFileMapping,
FILE_MAP_WRITE, 0, 0, 0);
if(lpFileMap == 0)
return;
if(fConversionType == OEM_TO_ANSI)
OemToCharBuff(lpFileMap, lpFileMap, dwFileSize);
else if(fConversionType == ANSI_TO_OEM)
CharToOemBuff(lpFileMap, lpFileMap, dwFileSize);
UnmapViewOfFile(lpFileMap);
CloseHandle(hFileMapping);
}
Вначале функция Oem2Char определяет размер исходного файла, идентификатор которого передается ей через параметр hSrcFile. Для определения размера файла используется функция GetFileSize.
На следующем шаге с помощью функции CreateFileMapping создается объект-отображение. Страницы этого объекта будут доступны и на чтение, и на запись, так как указан режим PAGE_READWRITE.
Для того чтобы получить доступ к памяти, отображенной на файл, наше приложение вызывает функцию MapViewOfFile. Отображение выполняется для чтения и записи, поэтому мы указали флаг FILE_MAP_WRITE. В случае успешного завершения функции адрес отображенной области записывается в локальную переменную lpFileMap.
Что же касается перекодировки файла, то она выполняется исключительно просто: мы передаем через первые два параметра функции перекодировки адрес, на который отображен файл, а через третий параметр - размер файла.
После того как перекодировка будет выполнена, необходимо вначале отменить отображение, а затем освободить идентификатор объекта-отображения. Первая задача решается в нашем приложении спомощью функции UnmapViewOfFile, а вторая - с помощью функции CloseHandle, которой в качестве единственного параметра передается идентификатор объекта-отображения.