Функция Oem2Char (синхронные операции с файлами)
Если приложение подготовлено таким образом, что оно работает с файлами при помощи синхронных операций, используется следующий вариант исходного текста функции Oem2Char:
void Oem2Char(HANDLE hSrcFile, HANDLE hDstFile)
{
DWORD dwBytesRead;
DWORD dwBytesWritten;
BOOL bResult;
while(TRUE)
{
bResult = ReadFile(hSrcFile, cBuf, 2048,
&dwBytesRead, NULL);
if(bResult && dwBytesRead == 0)
break;
if(fConversionType == OEM_TO_ANSI)
OemToCharBuff(cBuf, cBuf, dwBytesRead);
else if(fConversionType == ANSI_TO_OEM)
CharToOemBuff(cBuf, cBuf, dwBytesRead);
WriteFile(hDstFile, cBuf, dwBytesRead,
&dwBytesWritten, NULL);
}
}
Здесь мы работаем с файлом обычным образом.
Перекодировка файла выполняется в цикле, который прерывается при достижении конца исходного файла.
Функция Oem2Char при помощи функции ReadFile читает фрагмент исходного файла в буфер cBuf, расположенный в области глобальных переменных. Количество прочитанных байт записывается при этом в локальную переменную dwBytesRead.
При достижении конца исходного файла количество байт, прочитанных функцией ReadFile из файла, а также значение, возвращенное этой функцией, равно нулю. Этот факт мы используем для завершения цикла перекодировки.
После прочтения блока данных из исходного файла функция Oem2Char анализирует содержимое глобальной переменной fConversionType, определяя тип преобразования, который нужно выполнить. В зависимости от содержимого этой переменной вызывается либо функция OemToCharBuff, выполняющая преобразование из кодировки OEM в кодировку ANSI, либо функция CharToOemBuff, которая выполняет обратное преобразование.
На следующем этапе преобразованное содержимое буфера cBuf записывается в выходной файл при помощи функции WriteFile. При этом количество действительно записанных байт сохраняется в локальной переменной dwBytesWritten, однако в нашем приложении оно никак не используется.
Сделаем важное замечание относительно функций OemToCharBuff и CharToOemBuff.
Для преобразования текстовых строк из кодировки OEM в кодировку ANSI и обратно в программном интерфейсе операционной системы Microsoft Windows версии 3.1 имелся набор функций, описанный нами в 12 томе “Библиотеки системного программиста”, который называется “Операционная система Microsoft Windows 3.1 для программиста. Часть вторая”. Это такие функции как OemToAnsi, AnsiToOem, OemToAnsiBuff, AnsiToOemBuff.
В программном интерфейсе операционной системы Microsoft Windows NT эти функции оставлены для совместимости, однако ими не рекомендуется пользоваться. Причина заключается в том, что в Microsoft Windows NT можно работать с символами в кодировке Unicode, когда для представления каждого символа используется не один, а два байта.
Соответственно, вместо перечисленных выше функций необходимо использовать функции OemToChar, CharToOem, OemToCharBuff, CharToOemBuff, которые имеют такие же параметры, что и их 16-разрядные прототипы (за исключением того, что функциям OemToCharBuff и CharToOemBuff можно передавать 32-разрядную длину преобразуемой текстовой строки). В зависимости от того, используется ли приложением кодировка Unicode, эти функции могут преобразовывать строки из OEM в строки ANSI или Unicode (и обратно).