![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обмен данными между процессами [D6, Win2k, WinXP]
Сергей_С © (2006-07-12 09:19:00)Господа, подскажите, каким образом можно обмениваться данными меджу процессами, запущенными одновременно в одной ОС. Какой-нибудь простой и стабильный способ.
Варианты через файловую систему, DDE, OLE, COM - просьба не рассматривать.
Данные имеют бинарный формат.
Заранее спасибо.
MikProg (2006-07-13 19:27:00) [41]
> FileMapping - это просто кусок памяти.
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);
Это файловый объект (как дисковый файл, пайп и пр.) и с ним можно работать как с файлом, а значит можно выполнять Read пока не EOF.
Почемуто в хелпе к 2005 студии не написано, что если в качестве хендля использовать FFFF... то файл будет создан в составе своп файла, т.е. абсолютно незаметно.
Verg (2006-07-13 19:20:00) [42]Обменивайся через сокеты. Поверь, это решение никогдатебя не разочарует.
Ты окажешься
вне привязки к хосту,
вне привязки к платформе, и, практически,
вне ... к ОС.
Юрий Зотов (2006-07-13 19:07:00) [43]> Сергей_С (13.07.06 15:08) [38]
> другой способ определения размера буфера, без его передачи вместе с
> буфером :). Не уходя от использования FileMapping.
Например, после закладки данных в буфер послать сообщение, а через его параметр(ы) передать размер буфера. Это же сообщение послужит уведомлением о том, что данные готовы и их можно брать. А если еще и посылать его через SendMessage, то получаем полную синхронизацию работы с данными.
При использовании WM_COPYDATA получим практически тот же механизм.
Сергей_С (2006-07-13 15:13:00) [44]2 Игорь Шевченко © (13.07.06 15:11) [39]
ясно
Игорь Шевченко (2006-07-13 15:11:00) [45]Сергей_С (13.07.06 15:08) [38]
> Я имел в виду другой способ определения размера буфера,
> без его передачи вместе с буфером :). Не уходя от использования
> FileMapping.
Нету. FileMapping - это просто кусок памяти. А сколько туда положено, знает только положивший на момент положения и если он никому об этом явно не скажет, то размер положенного останется тайной.
Сергей_С (2006-07-13 15:08:00) [46]2 Игорь Шевченко © (13.07.06 15:06) [37]
Я имел в виду другой способ определения размера буфера, без его передачи вместе с буфером :). Не уходя от использования FileMapping.
Игорь Шевченко (2006-07-13 15:06:00) [47]
> Другого способа нет что-ли?
Есть. http://www.delphimaster.ru/articles/named_pipes/index.html
Сергей_С (2006-07-13 15:01:00) [48]2Игорь Шевченко © (13.07.06 14:48) [34]
А в первые два(четыре) байта положить размер блока ?
Положить не проблема.
Другого способа нет что-ли?
Evgeny V (2006-07-13 14:51:00) [49]
> GrayFace © (13.07.06 14:01) [31]
Посигналь обратно неустановленным Event (по твоему примеру один из E2 или Е3), отправляющий знает какой это эвент и будет ждать его, как синхронизацию. Вообще это не метод на мой взгляд, ни с двумя ни с тремя ...так что лучше стандртными способами воспользоваться.
> Сергей_С (13.07.06 14:30) [33]
Пример есть для дельфи 6 в директории DEMOS в IPCDEMOS.
Игорь Шевченко (2006-07-13 14:48:00) [50]
> Если бы я знал размер блока, который там лежит, то все понятно.
> Но я его не знаю! Получаю только адрес
А в первые два(четыре) байта положить размер блока ?
Сергей_С (2006-07-13 14:30:00) [51]Господа, тысячу извинений, что прерываю жаркую дискуссию.
Выбрал вариант с использованием CreateFileMapping.
С закладкой данных проблем не возникло.
Возникли непонятки с извлечением:
FpoBaseAddress := MapViewOfFile(FhFileMapObj, FILE_MAP_WRITE, 0, 0, 0);
После вызова этой функции я получаю указатель на начальный адрес данных объекта файлового отображения.
Но, скажите мне, что мне дальше делать с этим указателем? Если бы я знал размер блока, который там лежит, то все понятно. Но я его не знаю! Получаю только адрес. Данные бинарные, поэтому никакие stValue := PChar(FpoBaseAddress) - не подойдут.
Или я что-то неправильно понимаю?
GrayFace (2006-07-13 14:04:00) [52]0) и 3) - это я забыл убрать.
GrayFace (2006-07-13 14:01:00) [53]Нет, смотри как с 3:
E1 - принимающий принял данные
E2 - бит данных = 0
E3 - бит данных = 1
0) Все E = 0
1) Принимающий:
for i:=1 to размер do
E1 = 1
Wait for E2 или E3
В зависимости от результата ожидания ставит очередной бит
2) Отправляющий:
for i:=1 to размер do
E1 = 0
E2 или E3 = 1 в зависимости от бита данных
Wait for E1
3) goto 1)
Как обойтись без E1?
Evgeny V (2006-07-13 13:21:00) [54]
> GrayFace © (13.07.06 11:38) [27]
Изврат конечно - но можно, именованные события - одно для сигнала о том, что данные установлены, а второе собственно бит данных - но изврат.
Второй вариант, более корректный на мой взгляд, но тоже изврат, те же события - взвод одного означает бит 0, другого бит 1.
LOL
Не думаю, что возникнет необходимость пользоваться такими способами...
Игорь Шевченко (2006-07-13 12:18:00) [55]
> А для чего, когда, и на какой платформе?
Для межпроцессного взаимодействия, на платформе unix
DrPass (2006-07-13 11:49:00) [56]
> Как ни странно изначально сокеты предназначались вовсе не
> для сетевых приложений
Странно. А для чего, когда, и на какой платформе? И где об этом можно прочитать?
GrayFace (2006-07-13 11:38:00) [57]Leonid Troyanovsky © (12.07.06 22:02) [24]
А, почему, собс-но, не на двух?
Изврат, конечно, но возможность-то есть.
Как?
DVM (2006-07-13 10:09:00) [58]
> В любом случае, сетевые технологии должны использоваться
> для сетевых приложений
Как ни странно изначально сокеты предназначались вовсе не для сетевых приложений.
Сергей_С (2006-07-13 06:57:00) [59]ого, сколько насоветовали :)
Всем спасибо!
Leonid Troyanovsky (2006-07-12 22:02:00) [60]
> han_malign © (12.07.06 15:51) [12]
> Ну, на трех Event-ах можно организовать "полноценный" бинарный
> поток. Изврат конечно, но возможность то есть... :)
А, почему, собс-но, не на двух?
Изврат, конечно, но возможность-то есть.
--
Regards, LVT.