-
Добрый день.
Хотел бы узнать как можно наиболее эффективно и надежно передавать данные между несколькими приложениями т.е своими модулями расположенными на 1 кмпьютере.
TCP отпадает так как он может быть неустановлен на компьютере.
Как вариант рекомундуют использовать:
получатель:
procedure ReceiveMessage (var Msg: TMessage);
message WM_COPYDATA;
...
procedure TFormReceive.ReceiveMessage;
var
pcd: PCopyDataStruct;
begin
pcd := PCopyDataStruct(Msg.LParam);
Caption := PChar(pcd.lpData);
end;
отправитель:
procedure TFormXXX.Button1Click(Sender: TObject);
var
cd: TCopyDataStruct;
begin
cd.cbData := Length(Edit1.Text) + 1;
cd.lpData := PChar(Edit1.Text);
SendMessage(FindWindow('TFormReceive', nil), WM_COPYDATA, 0, LParam(@cd));
end;
Но тут вопрос, будет ли сообщение приходить например сервису у которого нет окон?
Возможно есть более универсальное рещение?
-
Delphi/Demos/IPCDemos
-
> нет окон
Послать сообщение можно и потоку без окон (PostThreadMessage).
-
> TCP отпадает так как он может быть неустановлен на компьютере.
Это КАК ТАК? Такого не бывает! ping 127.0.0.1 работает на всех современных ОС-ях.
Как вариант добавить COM-сервер в сервис, многие так и делают - решаються многие проблемы с маршалингом.
-
> tesseract © (24.06.08 10:23) [3]
Были инценденты к сожалению, стандартные TServerSosket вылетает почему то через 3-4 часа непрерывной работы. а Indy тормозят приложение при постоянном коннекте (хотя в Indy думаю что я делал что то неправельно)
> Юрий Зотов © (24.06.08 10:06) [2]
Имееться ввиду создать отдельный поток который будет крутиться постоянно и принимать сообщения?
-
> tesseract © (24.06.08 10:23) [3]
>
> > TCP отпадает так как он может быть неустановлен на компьютере.
>
>
>
> Это КАК ТАК? Такого не бывает! ping 127.0.0.1 работает
> на всех современных ОС-ях.
Стек протоклов TCP/IP может быть не установлен.
(Азбука начинающего программиста).
-
> Стек протоклов TCP/IP может быть не установлен.
Он может быть удалён. По умолчанию он ставиться всегда.
-
> dreamse (24.06.08 10:33) [4]
> Имееться ввиду создать отдельный поток который будет крутиться
> постоянно и принимать сообщения?
Да, стандартный цикл обработки сообщений.
while GetMessage(Msg, 0, 0, 0) do ...
-
> Имееться ввиду создать отдельный поток который будет крутиться
> постоянно и принимать сообщения?
Любой поток может принимать сообщения, если в нем создана очередь сообщений. Очередь создается автоматически при первом обращении в потоке к функции GetMessage или PeekMessage Если очередь еще не создана, и поток не может принимать сообщение, то PostThreadMessage вернет вам 0
-
GetMessage возвращает сообщение из очереди, а если очередь пуста, то зависает и ждет, пока не появится очередное сообщение.
PeekMessage возвращает сообщение или признак того, что очередь пуста, и продолжает работу потока. При этом возвращаемое сообщение может удаляться из очереди, а может и не удаляться.
-
Спасибо всем. Буду разбираться
-
> Но тут вопрос, будет ли сообщение приходить например сервису
> у которого нет окон?
не будет. сообщения передаются только внутри одного desktop-а
-
Старый дедовский DDE.
-
> стандартные TServerSosket вылетает почему то через 3-4
> часа непрерывной работы. а Indy тормозят приложение при
> постоянном коннекте
Не надо трындеть.
Просто у тебя ошибка в 17-й строке.
-
> dreamse (24.06.08 09:34)
Способов обмена масса:
1) Сообщения
2) Сокеты (и не обязательно TCP кстати)
3) Именованные каналы
4) COM и RPC
5) DDE
6) MMF
Самый универсальный - сокеты. Т.к. может быть использован везде, где есть стек нужных протоколов.
Говорить про отсутствие где то там протокола TCP просто смешно в наше время.
-
> DVM © (25.06.08 21:04) [14]
> 1) Сообщения
See also [11].
--
Regards, LVT.
-
> DVM © (25.06.08 21:04) [14]
> Говорить про отсутствие где то там протокола TCP просто
> смешно в наше время.
Не смешно. Во многих местах по условиям применения задачи наоборот ограничения в протоколах.
-
> Но тут вопрос, будет ли сообщение приходить например сервису у которого нет окон?
> Возможно есть более универсальное рещение?
А я на Pipe`ы реально подсела :)
-
> DVM © (25.06.08 21:04) [14]
Очень часто встречаються, все зависит от того где применяеться ПО
Очень часто встречаю 95 винду и ОЧЕНЬ часто резрешение экрана чтоит 600 - 800 :) хотя и Core Duo 2 + Vista
> Riply © (27.06.08 03:43) [17]
А поподробней?
-
> [18] dreamse (27.06.08 06:37)
>> Riply © (27.06.08 03:43) [17]
> А поподробней?
Да что уж там подробней. Пыталась соскочить,
да вот ценров реабилитации от Pipe`овой зависимости еще не создали :)
А если серьезно, смотри CreateNamedPipe и иже с нею :)
Где-то на форуме была статья Игоря Шевченко с примерами Pipe`ых клиента и сервера.
-