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


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


// Выбираем выходной файл if (GetSaveFileName(&ofn)) {

// Открываем на запись. // При необходимости создаем файл hf = _lcreat(ofn.lpstrFile, 0); return hf; } else return 0; }

// ------------------------------- // Функция Oem3Ansi // Перекодировка файла // -------------------------------

int Oem3Ansi(HFILE hfSrcFile, HFILE hfDstFile) { // Счетчик прочитанных байт DWORD cbRead;

// Размер файла DWORD dwFileSize;

// Идентификатор глобального блока // памяти, который будет использован для // чтения файла HGLOBAL hglbBuf;

// Указатель на глобальный блок памяти unsigned char huge * hBuf;

// Определяем размер файла. Для этого // устанавливаем текущую позицию на // конец файла dwFileSize = _llseek(hfSrcFile, 0l, 2);

// Устанавливаем текущую позицию // на начало файла _llseek(hfSrcFile, 0l, 0);

// Заказываем глобальный блок памяти, // размер которого равен длине файла hglbBuf = GlobalAlloc(GMEM_FIXED, dwFileSize); hBuf = (unsigned char huge *)GlobalLock(hglbBuf);

// Если мало свободной памяти, // возвращаем код ошибки if(hBuf == NULL) return(-1);

// Читаем файл в полученный блок памяти cbRead = _hread(hfSrcFile, hBuf, dwFileSize);

// Выполняем перекодировку for(long i=0; i < cbRead; i++) { // Перекодировка по таблице, // загруженной из ресурсов hBuf[i] = lpXlatTable[hBuf[i]];

// Перекодировка из OEM в ANSI OemToAnsiBuff((const char far*)&hBuf[i], (char far*)&hBuf[i], 1); }

// Сохраняем содержимое блока памяти в // выходном файле _hwrite(hfDstFile, hBuf, dwFileSize);

// Расфиксируем и освобождаем // блок памяти GlobalUnlock(hglbBuf); GlobalFree(hglbBuf); return 0; }

Функция WinMain сохраняет идентификатор копии приложения в глобальной переменной hInst. Этот идентификатор потребуется впоследствии для загрузки шаблона диалоговой панели из ресурсов приложения.

Далее, так же как и первой версии приложения OEM3ANSI, функция WinMain загружает из ресурсов дополнительную таблицу перекодировки, сохраняя ее адрес в переменной lpXlatTable.

Затем функция WinMain открывает входной и выходной файлы, вызывая функции GetSrcFile и GetDstFile, определенные в нашем приложении.


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