Передача данных между копиями
Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik
Передача данных между копиями
Кто-нибудь знает, как можно переслать данные (командную строку) от одной копии программы к другой? Попытался сделать нечто подобное в AmpView, но при просмотре в QV работает не совсем нормально...
PS. Delphi 7
PS. Delphi 7
- Sheridan
- Сообщения: 129
- Зарегистрирован: Вт мар 01, 2005 07:47
- Откуда: Пятигорск
- Контактная информация:
посмо3 в сторону named pipes
2Nik
У тебя уже есть решение. Добавь в ту структуру, где ты хранишь нхендл своего плагина еще что-то типа BUFFER:String[MAX_PATH]. И все. Загружаешь туда имя файла, отправляешь сообщение плагину, что нужно что-то прочитать из этой структуры. Плагин читает...
Это изврат. Но проверенный и работающий 100%
Еще есть такая штука, как WM_COPYDATA. Это уже "стандартная" штучка.
Выбирай.
У тебя уже есть решение. Добавь в ту структуру, где ты хранишь нхендл своего плагина еще что-то типа BUFFER:String[MAX_PATH]. И все. Загружаешь туда имя файла, отправляешь сообщение плагину, что нужно что-то прочитать из этой структуры. Плагин читает...
Это изврат. Но проверенный и работающий 100%
Еще есть такая штука, как WM_COPYDATA. Это уже "стандартная" штучка.
Выбирай.
Хороший юзер - мертвый юзер
Мои работы
Мои работы
2SCHMaster
В новых версиях я уже не использую FileMap - теперь нормально работает Mutex (для блокировки запуска копий).
А вот WM_COPYDATA я пробовал: между окнами одной программы все работает отлично, а при передачи от одной копии к другой вместо строки приходят кракозябры (видимо адрес неверно передается?)...
Алгоритм применял такой:
В итоге пришлось применить несколько извращенский способ: первая копия пишет нужные данные в ini-файл и отправляет второй копи уведомление, после чего вторая копия читает данные из файла.
В новых версиях я уже не использую 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;
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);
...