Передача данных между копиями

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Аватара пользователя
Nik
Сообщения: 583
Зарегистрирован: Сб янв 01, 2005 13:00
Откуда: Киров
Контактная информация:

Передача данных между копиями

Сообщение Nik »

Кто-нибудь знает, как можно переслать данные (командную строку) от одной копии программы к другой? Попытался сделать нечто подобное в AmpView, но при просмотре в QV работает не совсем нормально...

PS. Delphi 7
Аватара пользователя
Sheridan
Сообщения: 129
Зарегистрирован: Вт мар 01, 2005 07:47
Откуда: Пятигорск
Контактная информация:

Сообщение Sheridan »

посмо3 в сторону named pipes
Аватара пользователя
SCHMaster
Сообщения: 296
Зарегистрирован: Ср дек 15, 2004 02:32
Откуда: Киев
Контактная информация:

Сообщение SCHMaster »

2Nik
У тебя уже есть решение. Добавь в ту структуру, где ты хранишь нхендл своего плагина еще что-то типа BUFFER:String[MAX_PATH]. И все. Загружаешь туда имя файла, отправляешь сообщение плагину, что нужно что-то прочитать из этой структуры. Плагин читает...
Это изврат. Но проверенный и работающий 100%
Еще есть такая штука, как WM_COPYDATA. Это уже "стандартная" штучка.
Выбирай. :wink:
Хороший юзер - мертвый юзер
Мои работы
Аватара пользователя
Nik
Сообщения: 583
Зарегистрирован: Сб янв 01, 2005 13:00
Откуда: Киров
Контактная информация:

Сообщение Nik »

2SCHMaster
В новых версиях я уже не использую FileMap - теперь нормально работает Mutex (для блокировки запуска копий).
А вот WM_COPYDATA я пробовал: между окнами одной программы все работает отлично, а при передачи от одной копии к другой вместо строки приходят кракозябры (видимо адрес неверно передается?)...

Алгоритм применял такой:

Код: Выделить всё


// Для отправки:

procedure TAmpViewMainForm.Button1Click(Sender: TObject);
var
  cd: TCopyDataStruct;
begin
  cd.cbData := Length(Edit1.Text) + 1;
  cd.lpData := PChar(Edit1.Text);
  SendMessage(FindWindow('TAmpViewMainForm', nil), WM_COPYDATA, 0, LParam(@cd));
end;


// Для получения

private
 procedure ReceiveMessage (var Msg: TMessage); message WM_COPYDATA;

//

procedure ReceiveMessage;
var
  pcd: PCopyDataStruct;
begin
  pcd := PCopyDataStruct(Msg.LParam);
  Caption := PChar(pcd.lpData);
end;


В итоге пришлось применить несколько извращенский способ: первая копия пишет нужные данные в ini-файл и отправляет второй копи уведомление, после чего вторая копия читает данные из файла.
Аватара пользователя
SCHMaster
Сообщения: 296
Зарегистрирован: Ср дек 15, 2004 02:32
Откуда: Киев
Контактная информация:

Сообщение SCHMaster »

Nik

Код: Выделить всё

Отлавливаем сообщение

procedure TAnyApp.WMTransfer(var Msg: TWMCopyData);
var
i:Integer;
CmdStr:string;
CData:TCopyDataStruct;
len:integer;
begin
CData:=Msg.CopyDataStruct^;
CmdStr:='';
len:=CData.cbData;
for i:=0 to len-1 do
begin
CmdStr:=CmdStr+(PChar(CData.lpData)+i)^;
end;
if (not FileExists(CmdStr)) then Exit;
...
end;

Отправляем сообщение

...
DataStruct.lpData:=PChar(FileName);
DataStruct.cbData:=Length(FileName);
DataStruct.dwData:=0;
WParam:=SendFromHandle;
LParam:=Integer(@DataStruct);
SendMessage(W,WM_CopyData,WParam,LParam);
...
Где-то так...
Аватара пользователя
Nik
Сообщения: 583
Зарегистрирован: Сб янв 01, 2005 13:00
Откуда: Киров
Контактная информация:

Сообщение Nik »

SCHMaster
Спасибо! Все работает...
Аватара пользователя
SCHMaster
Сообщения: 296
Зарегистрирован: Ср дек 15, 2004 02:32
Откуда: Киев
Контактная информация:

Сообщение SCHMaster »

Nik
Невочто... Просто мне знакомо чувство, когда бъешься башкой о стену, а толку... А те кто знает - молчат :)
Аватара пользователя
Nik
Сообщения: 583
Зарегистрирован: Сб янв 01, 2005 13:00
Откуда: Киров
Контактная информация:

Сообщение Nik »

SCHMaster писал(а):Nik
Невочто... Просто мне знакомо чувство, когда бъешься башкой о стену, а толку... А те кто знает - молчат :)
Это точно... :)

PS. 2Ergo А как можно тему закрыть?
Ответить