Вход/Регистрация
Системное программирование в среде Windows
вернуться

Харт Джонсон М.

Шрифт:

#define UREC_SIZE 2 * REC_SIZE

static VOID WINAPI ReadDone(DWORD, DWORD, LPOVERLAPPED);

static VOID WINAPI WriteDone(DWORD, DWORD, LPOVERLAPPED);

/* Первая структура OVERLAPPED предназначена для чтения, а вторая — для записи. Структуры и буферы распределяются для каждой предстоящей операции. */

OVERLAPPED OverLapIn[MAX_OVRLP], OverLapOut [MAX_OVRLP];

CHAR AsRec[MAX_OVRLP][REC_SIZE];

WCHAR UnRec[MAX_OVRLP][REC_SIZE];

HANDLE hInputFile, hOutputFile;

LONGLONG nRecord, nDone;

LARGE_INTEGER FileSize;

int _tmain(int argc, LPTSTR argv[]) {

 DWORD ic;

 LARGE_INTEGER CurPosIn;

 hInputFile = CreateFile(argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

 hOutputFile = CreateFile(argv[2], GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);

 FileSize.LowPart = GetFileSize(hInputFile, &FileSize.HighPart);

 nRecord = FileSize.QuadPart / REC_SIZE;

 if ((FileSize.QuadPart % REC_SIZE) != 0) nRecord++;

 CurPosIn.QuadPart = 0;

 for (ic = 0; ic < MAX_OVRLP; ic++) {

OverLapIn[ic].hEvent = (HANDLE)ic; /* Перегрузить событие. */

OverLapOut[ic].hEvent = (HANDLE)ic; /* Поля. */

OverLapIn[ic].Offset = CurPosIn.LowPart;

OverLapIn[ic].OffsetHigh = CurPosIn.HighPart;

if (CurPosIn.QuadPart < FileSize.QuadPart) ReadFileEx(hInputFile, AsRec[ic], REC_SIZE, &OverLapIn [ic], ReadDone);

CurPosIn.QuadPart += (LONGLONG)REC_SIZE;

 }

 /* Выполняются все операции чтения. Войти в состояние дежурного ожидания и оставаться в нем до тех пор, пока не будут обработаны все записи.*/

 nDone = 0; 

 while (nDone < 2 * nRecord) SleepEx(INFINITE, TRUE);

 CloseHandle(hInputFile);

 CloseHandle(hOutputFile);

 _tprintf(_T("Преобразование из ASCII в Unicode завершено.\n"));

 return 0;

}

static VOID WINAPI ReadDone(DWORD Code, DWORD nBytes, LPOVERLAPPED pOv) {

 /* Чтение завершено. Преобразовать данные и инициировать запись. */

 LARGE_INTEGER CurPosIn, CurPosOut;

 DWORD ic, i;

 nDone++;

 /* Обработать запись и инициировать операцию записи. */

 ic = (DWORD)(pOv->hEvent);

 CurPosIn.LowPart = OverLapIn[ic].Offset;

 CurPosIn.HighPart = OverLapIn[ic].OffsetHigh;

 CurPosOut.QuadPart = (CurPosIn.QuadPart / REC_SIZE) * UREC_SIZE;

 OverLapOut[ic].Offset = CurPosOut.LowPart;

 OverLapOut[ic].OffsetHigh = CurPosOut.HighPart;

 /* Преобразовать запись из ASCII в Unicode. */

 for (i = 0; i < nBytes; i++) UnRec[ic][i] = AsRec[ic][i];

 WriteFileEx(hOutputFile, UnRec[ic], nBytes*2, &OverLapOut[ic], WriteDone);

 /* Подготовить структуру OVERLAPPED для следующего чтения. */

 CurPosIn.QuadPart += REC_SIZE * (LONGLONG)(MAX_OVRLP);

 OverLapIn[ic].Offset = CurPosIn.LowPart;

 OverLapIn[ic].OffsetHigh = CurPosIn.HighPart;

 return;

}

static VOID WINAPI WriteDone(DWORD Code, DWORD nBytes, LPOVERLAPPED pOv) {

 /* Запись завершена. Инициировать следующую операцию чтения. */

 LARGE_INTECER CurPosIn;

 DWORD ic;

 nDone++;

 ic = (DWORD)(pOv->hEvent);

 CurPosIn.LowPart = OverLapIn[ic].Offset;

 CurPosIn.HighPart = OverLapIn[ic].OffsetHigh;

  • Читать дальше
  • 1
  • ...
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: