Операционная система Microsoft Windows 3.1 для программиста -том 3


Листинг 4.3. Файл oem3ansi/oem3ansi.cpp - часть 5


После определения размера файла необходимо установить текущую позицию на начало файла. В противном случае при попытке прочитать данные мы получим состояние "Конец файла". Для установки текущей позиции на начало файла мы вызываем функцию _llseek еще раз, но с другими параметрами:

_llseek(hfSrcFile, 0l, 0);

После определения размера входного файла функция Oem3Ansi заказывает фиксированный блок из глобальной области памяти (при помощи функции GlobalAlloc), и фиксирует его для получения адреса (при помощи функции GlobalLock). Адрес блока записывается в переменную hBuf типа unsigned char huge*. Размер заказанного блока равен размеру файла.

Затем весь файл читается в буфер, для чего используется функция _hread:

cbRead = _hread(hfSrcFile, hBuf, dwFileSize);

Перекодировка выполняется в следующем цикле:

for(long i=0; i < cbRead; i++) { hBuf[i] = lpXlatTable[hBuf[i]]; OemToAnsiBuff((const char far*)&hBuf[i], (char far*)&hBuf[i], 1); }

Для перекодировки по дополнительной таблице мы адресуемся к блоку памяти через указатель типа huge, так как размер блока памяти может превышать 64 Кбайт.

Функция OemToAnsiBuff может перекодировать буфер размером не более 64 Кбайт, поэтому мы вызываем ее отдельно для каждого байта перекодируемого буфера.

После подготовки буфера мы записываем его в выходной файл, вызывая функцию _hwrite:

_hwrite(hfDstFile, hBuf, dwFileSize);

Перед возвратом управления функция Oem3Ansi расфиксирует и освобождает заказанный ранее блок памяти, вызывая функции GlobalUnlock и GlobalFree.

Файл описания ресурсов приложения OEM3ANSI приведен в листинге 4.4.




Начало  Назад  Вперед



Книжный магазин