![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача данных между приложениями [D7, Win2k, WinXP]
dreamse © (2008-06-24 09:34:00)Добрый день.
Хотел бы узнать как можно наиболее эффективно и надежно передавать данные между несколькими приложениями т.е своими модулями расположенными на 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;
Но тут вопрос, будет ли сообщение приходить например сервису у которого нет окон?
Возможно есть более универсальное рещение?
Игорь Шевченко (2008-06-27 14:05:00) [1]
> Где-то на форуме была статья Игоря Шевченко с примерами
> Pipe`ых клиента и сервера.
ось туточки: http://www.delphimaster.ru/articles/named_pipes/index.html
Riply (2008-06-27 08:18:00) [2]> [18] dreamse (27.06.08 06:37)
>> Riply © (27.06.08 03:43) [17]
> А поподробней?
Да что уж там подробней. Пыталась соскочить,
да вот ценров реабилитации от Pipe`овой зависимости еще не создали :)
А если серьезно, смотри CreateNamedPipe и иже с нею :)
Где-то на форуме была статья Игоря Шевченко с примерами Pipe`ых клиента и сервера.
dreamse (2008-06-27 06:37:00) [3]> DVM © (25.06.08 21:04) [14]
Очень часто встречаються, все зависит от того где применяеться ПО
Очень часто встречаю 95 винду и ОЧЕНЬ часто резрешение экрана чтоит 600 - 800 :) хотя и Core Duo 2 + Vista
> Riply © (27.06.08 03:43) [17]
А поподробней?
Riply (2008-06-27 03:43:00) [4]> Но тут вопрос, будет ли сообщение приходить например сервису у которого нет окон?
> Возможно есть более универсальное рещение?
А я на Pipe`ы реально подсела :)
Тын-Дын (2008-06-27 01:01:00) [5]
> DVM © (25.06.08 21:04) [14]
> Говорить про отсутствие где то там протокола TCP просто
> смешно в наше время.
Не смешно. Во многих местах по условиям применения задачи наоборот ограничения в протоколах.
Leonid Troyanovsky (2008-06-26 18:18:00) [6]
> DVM © (25.06.08 21:04) [14]
> 1) Сообщения
See also [11].
--
Regards, LVT.
DVM (2008-06-25 21:04:00) [7]
> dreamse (24.06.08 09:34)
Способов обмена масса:
1) Сообщения
2) Сокеты (и не обязательно TCP кстати)
3) Именованные каналы
4) COM и RPC
5) DDE
6) MMF
Самый универсальный - сокеты. Т.к. может быть использован везде, где есть стек нужных протоколов.
Говорить про отсутствие где то там протокола TCP просто смешно в наше время.
Сергей М. (2008-06-25 19:54:00) [8]
> стандартные TServerSosket вылетает почему то через 3-4
> часа непрерывной работы. а Indy тормозят приложение при
> постоянном коннекте
Не надо трындеть.
Просто у тебя ошибка в 17-й строке.
int64 (2008-06-25 19:16:00) [9]Старый дедовский DDE.
Игорь Шевченко (2008-06-24 17:53:00) [10]
> Но тут вопрос, будет ли сообщение приходить например сервису
> у которого нет окон?
не будет. сообщения передаются только внутри одного desktop-а
dreamse (2008-06-24 12:43:00) [11]Спасибо всем. Буду разбираться
palva (2008-06-24 12:26:00) [12]GetMessage возвращает сообщение из очереди, а если очередь пуста, то зависает и ждет, пока не появится очередное сообщение.
PeekMessage возвращает сообщение или признак того, что очередь пуста, и продолжает работу потока. При этом возвращаемое сообщение может удаляться из очереди, а может и не удаляться.
palva (2008-06-24 12:21:00) [13]
> Имееться ввиду создать отдельный поток который будет крутиться
> постоянно и принимать сообщения?
Любой поток может принимать сообщения, если в нем создана очередь сообщений. Очередь создается автоматически при первом обращении в потоке к функции GetMessage или PeekMessage Если очередь еще не создана, и поток не может принимать сообщение, то PostThreadMessage вернет вам 0
Юрий Зотов (2008-06-24 12:14:00) [14]> dreamse (24.06.08 10:33) [4]
> Имееться ввиду создать отдельный поток который будет крутиться
> постоянно и принимать сообщения?
Да, стандартный цикл обработки сообщений.
while GetMessage(Msg, 0, 0, 0) do ...
tesseract (2008-06-24 10:44:00) [15]
> Стек протоклов TCP/IP может быть не установлен.
Он может быть удалён. По умолчанию он ставиться всегда.
Тын-Дын (2008-06-24 10:34:00) [16]
> tesseract © (24.06.08 10:23) [3]
>
> > TCP отпадает так как он может быть неустановлен на компьютере.
>
>
>
> Это КАК ТАК? Такого не бывает! ping 127.0.0.1 работает
> на всех современных ОС-ях.
Стек протоклов TCP/IP может быть не установлен.
(Азбука начинающего программиста).
dreamse (2008-06-24 10:33:00) [17]> tesseract © (24.06.08 10:23) [3]
Были инценденты к сожалению, стандартные TServerSosket вылетает почему то через 3-4 часа непрерывной работы. а Indy тормозят приложение при постоянном коннекте (хотя в Indy думаю что я делал что то неправельно)
> Юрий Зотов © (24.06.08 10:06) [2]
Имееться ввиду создать отдельный поток который будет крутиться постоянно и принимать сообщения?
tesseract (2008-06-24 10:23:00) [18]
> TCP отпадает так как он может быть неустановлен на компьютере.
Это КАК ТАК? Такого не бывает! ping 127.0.0.1 работает на всех современных ОС-ях.
Как вариант добавить COM-сервер в сервис, многие так и делают - решаються многие проблемы с маршалингом.
Юрий Зотов (2008-06-24 10:06:00) [19]> нет окон
Послать сообщение можно и потоку без окон (PostThreadMessage).
MBo (2008-06-24 09:42:00) [20]Delphi/Demos/IPCDemos