Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Передача параметров между приложениями


Автор: aktuba 19.10.2006, 21:04
Такой вопрос: запущены две копии одной и той-же программы с разными параметрами коммандной строки:

1. c:/app.exe /strings_1
2. c:/app.exe /strings_2

Как из второй программы, которая запущена позже, передать данные коммандной строки в первую программу?
 smile 

Автор: Alexeis 19.10.2006, 21:58
1) Через буфер обмена
2) Через пересылку сообщений
3) Через DDE
4) Через OLE


Автор: aktuba 19.10.2006, 22:09
1. Буфер обмена не подходит, т.к. не очень хорошо портить данные пользователя.
2. Сообщения - то, что надо. Но у меня мало опыта в этом. Как с помощью сообщений передать строку?
3 и 4. Не знаю... Вообще никогда с этим не работал. Может это лучше чем сообщения? Есть примеры?

Добавлено @ 22:21 
в DelphiWorld нашел пример:

получатель: 

Код

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;


А еще какие есть способы?

Автор: Alexeis 19.10.2006, 22:27
Цитата(aktuba @  19.10.2006,  22:09 Найти цитируемый пост)
1. Буфер обмена не подходит, т.к. не очень хорошо портить данные пользователя.

В NT системах, можно и не портить. Там можно сколько угодно объектов пихать, и так же вытаскиать.

С сообщениями принцип таков. Регистрируется сообщение с номером WM_USER + N, где N некоторое число. Строка разбивается на слова по 4 байта и слова записываются в Lparam и wParam. 
В программе приемнике пишется обработчик который их собирает в строку.

Добавлено @ 22:34 
DDE уже устарело, но служит именно для этой цели. Про него можно прочитать во многих книгах.
OLE довольно сложная технология требующая создания сервера и клиента. Подключение можно производить динамически.

Автор: Snowy 19.10.2006, 22:54
Цитата(alexeis1 @  19.10.2006,  22:27 Найти цитируемый пост)
WM_USER + N
Нет. Строка передаётся через WM_COPYDATA.
Через WM_USER её не передать.
Примеров на форуме масса. Нужно только в строке поиска набрать WM_COPYDATA

Автор: Alexeis 19.10.2006, 23:07
Цитата(Snowy @  19.10.2006,  22:54 Найти цитируемый пост)
Через WM_USER её не передать

Почему? Я вроде такое тоже встречал, вот только сейчас не могу найти.

Автор: Romikgy 19.10.2006, 23:10
Цитата(Snowy @  19.10.2006,  21:54 Найти цитируемый пост)
Через WM_USER её не передать.

имхо если извратится то можно smile

Автор: Snowy 19.10.2006, 23:12
Нельзя передать между приложениями.
Внутри одного процесса можно. Между процессами - нет.
У них области памяти разные. 
Для этого и придумана WM_COPYDATA - для упрощения процесса.
Она создаёт MM файл, копирует туда данные, передаёт другому процессу, ждёт возврата, уничтожает MM файл.
Специальное сообщение - чтобы всё это руками не делать.

Добавлено @ 23:14 
Ага. Не дочитал твой вариант до конца.
Так конечно тоже можно. Но это нерациональный вариант.
WM_COPYDATA куда проще.

Добавлено @ 23:24 
А вот и готовый примерчик:
http://forum.vingrad.ru/index.php?showtopic=83144&view=findpost&p=642109

Автор: Sansa 20.10.2006, 10:04
В JVCL есть модуль JvAppInst.pas. В нем реализован компонент, который определяет, одна ли копия приложения запущена, и что делать, если их несколько.

Автор: BUGOR 20.10.2006, 10:30
Цитата

А еще какие есть способы?


Анонимные пайпы
Глобальные атомы
Мэилслоты
Ну и именованые Memory Mapped File регионы(что кстати и использует WM_COPYDATA)

Но в обычных рядовых ситуациях конечно WM_COPYDATA очень хорошо подходит.

Автор: Gawron 21.9.2008, 20:04
Стандартные средства для работы с DDE в Делфи позволяют передавать типы PChar и TStrings. А как можно организовать передачу данных другого типа через DDE (а именно: массив чисел типа Integer или Real)? Есть ли какие-либо компоненты для работы с DDE, позволяющие организовать такую передачу?

Автор: aktuba 21.9.2008, 22:38
Gawron, а новый пост создать не судьба, вместо того, чтобы поднимать пост 2006-го года?

Автор: Alexeis 21.9.2008, 22:50
aktuba, все нормально. Вопрос по теме. Зачем плодить сущности. 
Gawron, PChar это ж просто указатель на буфер в памяти. Туда можно записать все что хош smile . Потом просто приведи указатель к нужному типу и все.

Автор: Gawron 24.9.2008, 10:31
Спасибо. А не будет никаких сбоев, если к общему массиву (целых чисел) будут обращаться сразу два разных приложения?

Автор: Alexeis 24.9.2008, 10:59
Цитата(Gawron @  24.9.2008,  09:31 Найти цитируемый пост)
Спасибо. А не будет никаких сбоев, если к общему массиву (целых чисел) будут обращаться сразу два разных приложения? 

  Если только читать, то проблем быть не должно.

Автор: Gawron 24.9.2008, 15:01
Суть проблемы: одна программа формирует числовой массив. При каждом движении мыши значения элементов массива меняются. А другая программа читает эти данные. Насколько вероятны сбои в такой ситуации?

Автор: Rohoss 24.9.2008, 19:19
Немножко офтоп:
А маршалинг в данной ситуации не подходит?

Автор: AntonN 24.9.2008, 20:41
добавлю к списку Alexeis - можно еще сокеты прикрутить smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)