стрельба по-македонски ДМИТРИЙ КОВАЛЕНКО Спецвыпуск: Хакер, номер #071, стр. 071-040-6 begin // нет, открыть memory-mapped файл не удалось writeln('Error! MapViewOfFile returns nil.'); // закрываем хендл memory-mapped файла и выходим CloseHandle(hFile); exit; end; Организуешь цикл передачи в memory-mapped файл введенных с клавиатуры строк: // будем передавать через memory-mapped файл сообщения // до тех пор, пока пользователь не введет "stop" while s<>'stop' do begin // читаем строку с клавиатуры write('Message #', i, ': '); readln(s); // записываем строку в memory-mapped файл CopyMemory(pFileContent, pchar(s), length(s)); // увеличиваем счетчик сообщений inc(i); end; И после всего: // закрываем отображение и хендл memory-mapped файла UnmapViewOfFile(pFileContent); CloseHandle(hFile); end. Все, теперь можно начинать писать программу MemoryMapped2, которая будет считывать строчки из memory-mapped файла и выводить их в консоль. Сначала рассмотрим соответствующий код на Visual C++. Снова открываешь Visual Studio и создаешь консольное приложение MemoryMapped2. Выделяешь исходный код MemoryMapped1 и копируешь в файл MemoryMapped2.cpp. Затем целиком удаляешь цикл ввода строк, начинающийся со строчки while(strcmp((char*)pFileContent, "stop")!=0), и вместо него вписываешь цикл чтения строк из memory-mapped файла: // считываем из memory-mapped файла сообщения, пока // не считаем "stop" while(strcmp((char*)pFileContent, "stop")!=0) { // в memory-mapped файле есть строка? if(strcmp((char*)pFileContent, "")!=0) { // да — выводим сообщение printf("Incoming message #%d: %s\n",\ i, (char*)pFileContent); // очищаем (заполняем нулями) буфер memset(pFileContent, '\0', 1024); // увеличиваем счетчик сообщений i++; } }; Вот и все. Как видишь, единственное отличие MemoryMapped2 от MemoryMapped1 в том, что чтение из memory-mapped файла, а не запись в него. Аналогично, чтобы получить MemoryMapped2 на Delphi, в исходном коде MemoryMapped1.pas достаточно заменить цикл записи строк, который начинается с while s<>'stop' do, на цикл чтения: // считываем из memory-mapped файла сообщения, пока // не считаем "stop" while s<>'stop' do begin // в memory-mapped файле есть строка? if (byte(pFileContent^)<>0) then begin // да — выводим сообщение s:=string(pchar(pFileContent)); writeln('Incoming message ',i,': ', s); // очищаем (заполняем нулями) буфер FillMemory(pFileContent, 1024, 0); // увеличиваем счетчик сообщений inc(i); end; end; Конечно, это не единственный способ «подружить» между собой две программы. Есть еще DDE, именованные каналы, сокеты, COM, DCOM... Но это намного сложнее и требует больше кода. #include <stdio.h> char format[] = "%s %s\n"; int main() { __asm{ mov eax, offset format ; заносим в eax смещение строки format mov bl, byte ptr [eax+2] ; теперь в bl третий байт из строки format } } __asm{ mov ecx, 10 ; заносим в ecx число 10 jmp short lab ; принудительный короткий переход на lab xor ecx, ecx ; обнуление ecx (никогда не произойдет из-за предыдущего ; короткого перехода) lab: dec ecx ; декремент ecx cmp ecx, 0 ; сравниваем с 0 jne lab ; если не равно 0, переходим на метку lab |