View previous topic :: View next topic |
Author |
Message |
Nik
Joined: 01 Jan 2005 Posts: 583 Location: Киров
|
(Separately) Posted: Mon Feb 21, 2005 13:19 Post subject: Передача данных между копиями |
|
|
Кто-нибудь знает, как можно переслать данные (командную строку) от одной копии программы к другой? Попытался сделать нечто подобное в AmpView, но при просмотре в QV работает не совсем нормально...
PS. Delphi 7 |
|
Back to top |
|
|
Sheridan
Joined: 01 Mar 2005 Posts: 129 Location: Пятигорск
|
|
Back to top |
|
|
SCHMaster
Joined: 15 Dec 2004 Posts: 296 Location: Киев
|
(Separately) Posted: Wed Mar 02, 2005 03:55 Post subject: |
|
|
2Nik
У тебя уже есть решение. Добавь в ту структуру, где ты хранишь нхендл своего плагина еще что-то типа BUFFER:String[MAX_PATH]. И все. Загружаешь туда имя файла, отправляешь сообщение плагину, что нужно что-то прочитать из этой структуры. Плагин читает...
Это изврат. Но проверенный и работающий 100%
Еще есть такая штука, как WM_COPYDATA. Это уже "стандартная" штучка.
Выбирай. _________________ Хороший юзер - мертвый юзер
Мои работы |
|
Back to top |
|
|
Nik
Joined: 01 Jan 2005 Posts: 583 Location: Киров
|
(Separately) Posted: Wed Mar 02, 2005 19:20 Post subject: |
|
|
2SCHMaster
В новых версиях я уже не использую FileMap - теперь нормально работает Mutex (для блокировки запуска копий).
А вот WM_COPYDATA я пробовал: между окнами одной программы все работает отлично, а при передачи от одной копии к другой вместо строки приходят кракозябры (видимо адрес неверно передается?)...
Алгоритм применял такой:
Code: |
// Для отправки:
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-файл и отправляет второй копи уведомление, после чего вторая копия читает данные из файла. |
|
Back to top |
|
|
SCHMaster
Joined: 15 Dec 2004 Posts: 296 Location: Киев
|
(Separately) Posted: Fri Mar 04, 2005 03:46 Post subject: |
|
|
Nik
Code: | Отлавливаем сообщение
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);
... |
Где-то так... |
|
Back to top |
|
|
Nik
Joined: 01 Jan 2005 Posts: 583 Location: Киров
|
(Separately) Posted: Fri Mar 04, 2005 21:22 Post subject: |
|
|
SCHMaster
Спасибо! Все работает... |
|
Back to top |
|
|
SCHMaster
Joined: 15 Dec 2004 Posts: 296 Location: Киев
|
(Separately) Posted: Sat Mar 05, 2005 03:29 Post subject: |
|
|
Nik
Невочто... Просто мне знакомо чувство, когда бъешься башкой о стену, а толку... А те кто знает - молчат |
|
Back to top |
|
|
Nik
Joined: 01 Jan 2005 Posts: 583 Location: Киров
|
(Separately) Posted: Sat Mar 05, 2005 21:34 Post subject: |
|
|
SCHMaster wrote: | Nik
Невочто... Просто мне знакомо чувство, когда бъешься башкой о стену, а толку... А те кто знает - молчат |
Это точно...
PS. 2Ergo А как можно тему закрыть? |
|
Back to top |
|
|
|