Программирование для Windows NT (том 2)

Функция 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, которой в качестве единственного параметра передается идентификатор объекта-отображения.



Содержание раздела