стрельба по-македонски ДМИТРИЙ КОВАЛЕНКО Спецвыпуск: Хакер, номер #071, стр. 071-040-5 Опять коротко остановимся на параметрах, которые мы передаем в MapViewOfFile. Первый параметр – хендл memory-mapped файла. Вторым параметром у нас передается FILE_MAP_ALL_ACCESS. Это значит, что мы хотим получить полный доступ к отображенному файлу. Третий и четвертый параметры определят 64-разрядное смещение отображаемого участка относительно начала файла. Поскольку мы хотим отображать файл с начала (с нулевого смещения), у нас нули. Ну, и пятый параметр – число типа DWORD, которое определяет, сколько байт нужно отобразить. Мы передаем 0 – это значит, что нам нужно все. Если MapViewOfFile завершилась успешно, в pFileContent будет смещение отображаемого файла. В случае неудачи там будет NULL. Отслеживаешь, и если MapViewOfFile вернула NULL, то закрываешь хендл memory-mapped файла с помощью API CloseHandle и выходишь: // memory-mapped файл отображен? if(pFileContent==NULL) { // нет, открыть memory-mapped файл не удалось printf("Error! MapViewOfFile returns NULL."); // закрываем хендл memory-mapped файла и выходим CloseHandle(hFile); return 0; }; Дальше организуем цикл, который читает строки с клавиатуры. В качестве буфера для этих строк используется наш memory-mapped файл. Цикл выглядит следующим образом: // инициализируем счетчик сообщений int i = 1; // будем передавать через memory-mapped файл сообщения // до тех пор, пока пользователь не введет «stop» while(strcmp((char*)pFileContent, "stop")!=0) { // ожидаем ввода printf("Message #%d: ", i); scanf("%1023s\0", (char*)pFileContent, 1024); // увеличиваем счетчик сообщений i++; }; Когда программа завершает работу, прекращаем отображение memory-mapped файла с помощью API UnmapViewOfFile и закрываем его хендл: // закрываем отображение и хендл memory-mapped файла UnmapViewOfFile(pFileContent); CloseHandle(hFile); // выходим return 0; } На Delphi MemoryMapped1 реализуется точно так же. Чтобы не повторяться, прокомментируем принципиальные моменты. Открываешь Borland Delphi и создаешь новое консольное приложение. Сохраняешь его под именем MemoryMapped1. Затем прописываешь в начале файла MemoryMapped1.dpr: {$APPTYPE CONSOLE} // использовать Windows API uses Windows; Затем прописываешь все необходимые переменные: var // хендл memory-mapped файла hFile: THandle; // указатель на отображение memory-mapped файла в памяти pFileContent: pointer; // счетчик количества отображений i: integer = 1; // строка, в которую будет осуществляться ввод s: string; Затем создаешь memory-mapped файл и проверяешь, успешно ли завершилась CreateFileMapping: begin // создаем memory-mapped файл hFile:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, 1024, 'DigitalPoem'); // memory-mapped файл открыт? if(hFile=0) then begin // нет, открыть memory-mapped файл не удалось writeln('Error! MapViewOfFile returns nil.'); exit; end; Отображаешь memory-mapped файл в память и проверяешь, получилось ли: // отобразим memory-mapped файл с полным доступом pFileContent:= MapViewOfFile(hFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); // memory-mapped файл отображен? if pFileContent=nil then |