Конференция "Основная" » Передача данных между приложениями [D7, Win2k, WinXP]
 
  • dreamse (24.06.08 09:34) [0]
    Добрый день.
    Хотел бы узнать как можно наиболее эффективно и надежно передавать данные между несколькими приложениями т.е своими модулями расположенными на 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;



    Но тут вопрос, будет ли сообщение приходить например сервису у которого нет окон?

    Возможно есть более универсальное рещение?
  • MBo © (24.06.08 09:42) [1]
    Delphi/Demos/IPCDemos
  • Юрий Зотов © (24.06.08 10:06) [2]
    > нет окон

    Послать сообщение можно и потоку без окон (PostThreadMessage).
  • tesseract © (24.06.08 10:23) [3]

    > TCP отпадает так как он может быть неустановлен на компьютере.


    Это КАК ТАК? Такого не бывает!  ping 127.0.0.1 работает на всех современных ОС-ях.

    Как вариант добавить COM-сервер в сервис, многие так и делают - решаються многие проблемы с маршалингом.
  • dreamse (24.06.08 10:33) [4]
    > tesseract ©   (24.06.08 10:23) [3]

    Были инценденты к сожалению, стандартные TServerSosket вылетает почему то через 3-4 часа непрерывной работы. а Indy тормозят приложение при постоянном коннекте (хотя в Indy думаю что я делал что то неправельно)

    > Юрий Зотов ©   (24.06.08 10:06) [2]

    Имееться ввиду создать отдельный поток который будет крутиться постоянно и принимать сообщения?
  • Тын-Дын © (24.06.08 10:34) [5]

    > tesseract ©   (24.06.08 10:23) [3]
    >
    > > TCP отпадает так как он может быть неустановлен на компьютере.
    >
    >
    >
    > Это КАК ТАК? Такого не бывает!  ping 127.0.0.1 работает
    > на всех современных ОС-ях.


    Стек протоклов TCP/IP может быть не установлен.
    (Азбука начинающего программиста).
  • tesseract © (24.06.08 10:44) [6]

    > Стек протоклов TCP/IP может быть не установлен.


    Он может быть удалён. По умолчанию он ставиться всегда.
  • Юрий Зотов © (24.06.08 12:14) [7]
    > dreamse   (24.06.08 10:33) [4]

    > Имееться ввиду создать отдельный поток который будет крутиться
    > постоянно и принимать сообщения?

    Да, стандартный цикл обработки сообщений.
    while GetMessage(Msg, 0, 0, 0) do ...
  • palva © (24.06.08 12:21) [8]

    > Имееться ввиду создать отдельный поток который будет крутиться
    > постоянно и принимать сообщения?

    Любой поток может принимать сообщения, если в нем создана очередь сообщений. Очередь создается автоматически при первом обращении в потоке к функции GetMessage или PeekMessage Если очередь еще не создана, и поток не может принимать сообщение, то PostThreadMessage вернет вам 0
  • palva © (24.06.08 12:26) [9]
    GetMessage возвращает сообщение из очереди, а если очередь пуста, то зависает и ждет, пока не появится очередное сообщение.
    PeekMessage возвращает сообщение или признак того, что очередь пуста, и продолжает работу потока. При этом возвращаемое сообщение может удаляться из очереди, а может и не удаляться.
  • dreamse (24.06.08 12:43) [10]
    Спасибо всем. Буду разбираться
  • Игорь Шевченко © (24.06.08 17:53) [11]

    > Но тут вопрос, будет ли сообщение приходить например сервису
    > у которого нет окон?


    не будет. сообщения передаются только внутри одного desktop-а
  • int64 (25.06.08 19:16) [12]
    Старый дедовский DDE.
  • Сергей М. © (25.06.08 19:54) [13]

    >  стандартные TServerSosket вылетает почему то через 3-4
    > часа непрерывной работы. а Indy тормозят приложение при
    > постоянном коннекте


    Не надо трындеть.
    Просто у тебя ошибка в 17-й строке.
  • DVM © (25.06.08 21:04) [14]

    > dreamse   (24.06.08 09:34)  

    Способов обмена масса:

    1) Сообщения
    2) Сокеты (и  не обязательно TCP кстати)
    3) Именованные каналы
    4) COM и RPC
    5) DDE
    6) MMF

    Самый универсальный - сокеты. Т.к. может быть использован везде, где есть стек нужных протоколов.

    Говорить про отсутствие где то там протокола TCP просто смешно в наше время.
  • Leonid Troyanovsky © (26.06.08 18:18) [15]

    > DVM ©   (25.06.08 21:04) [14]

    > 1) Сообщения

    See also [11].

    --
    Regards, LVT.
  • Тын-Дын © (27.06.08 01:01) [16]

    > DVM ©   (25.06.08 21:04) [14]
    > Говорить про отсутствие где то там протокола TCP просто
    > смешно в наше время.


    Не смешно. Во многих местах по условиям применения задачи наоборот ограничения в протоколах.
  • Riply © (27.06.08 03:43) [17]
    > Но тут вопрос, будет ли сообщение приходить например сервису у которого нет окон?
    > Возможно есть более универсальное рещение?

    А я на Pipe`ы реально подсела :)
  • dreamse (27.06.08 06:37) [18]
    > DVM ©   (25.06.08 21:04) [14]

    Очень часто встречаються, все зависит от  того где применяеться ПО
    Очень часто встречаю 95 винду и ОЧЕНЬ часто резрешение экрана чтоит 600 - 800 :) хотя и Core Duo 2 + Vista

    > Riply ©   (27.06.08 03:43) [17]

    А поподробней?
  • Riply © (27.06.08 08:18) [19]
    > [18] dreamse   (27.06.08 06:37)
    >> Riply ©   (27.06.08 03:43) [17]
    > А поподробней?

    Да что уж там подробней. Пыталась соскочить,
    да вот ценров реабилитации от Pipe`овой зависимости еще не создали :)

    А если серьезно, смотри CreateNamedPipe и иже с нею :)
    Где-то на форуме была статья Игоря Шевченко с примерами Pipe`ых клиента и сервера.
  • Игорь Шевченко © (27.06.08 14:05) [20]

    > Где-то на форуме была статья Игоря Шевченко с примерами
    > Pipe`ых клиента и сервера.


    ось туточки: http://www.delphimaster.ru/articles/named_pipes/index.html
 
Конференция "Основная" » Передача данных между приложениями [D7, Win2k, WinXP]
Есть новые Нет новых   [134491   +13][b:0][p:0.001]