GetLastError());
getch();
return 0;
}
// Выполняем отображение файла на память.
// В переменную lpFileMap будет записан указатель на
// отображаемую область памяти
lpFileMap = MapViewOfFile(hFileMapping,
FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
// Если выполнить отображение не удалось,
// выводим код ошибки
if(lpFileMap == 0)
{
fprintf(stdout,"MapViewOfFile: Error %ld\n",
GetLastError());
getch();
return 0;
}
// Готовим массив идентификаторов событий
// для функции WaitForMultipleObjects
hEvents[0] = hEventTermination;
hEvents[1] = hEventChar;
// Цикл отображения. Этот цикл завершает свою работу
// при завершении процесса ввода
while(TRUE)
{
// Выполняем ожидание одного из двух событий:
// - завершение клиентского процесса;
// - завершение ввода символа
dwRetCode = WaitForMultipleObjects(2,
hEvents, FALSE, INFINITE);
// Если ожидание любого из двух событий было отменено,
// если произошло первое событие (завершение клиентского
// процесса) или если произошла ошибка, прерываем цикл
if(dwRetCode == WAIT_ABANDONED_0
dwRetCode == WAIT_ABANDONED_0 + 1
dwRetCode == WAIT_OBJECT_0
dwRetCode == WAIT_FAILED)
break;
// Читаем символ из первого байта отображенной
// области памяти, записанный туда клиентским
// процессом, и отображаем его в консольном окне
putch(*((LPSTR)lpFileMap));
}
// Закрываем идентификаторы объектов-событий
CloseHandle(hEventChar);
CloseHandle(hEventTermination);
// Отменяем отображение файла
UnmapViewOfFile(lpFileMap);
// Освобождаем идентификатор созданного
// объекта-отображения
CloseHandle(hFileMapping);
return 0;
}
В глобальных переменных hEventChar и hEventTermination хранятся идентификаторы объектов-событий, предназначенных, соответственно, для работы с клавиатурой и для фиксации момента завершения работы приложения Fmap/Client. Эти же идентификаторы записываются в глобальный массив hEvents, который используется функцией WaitForMultipleObjects.