Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обмен данными между процессами [D6, Win2k, WinXP]


Страницы:   1 2 3 4 5

Сергей_С ©   (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.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо