Текущий архив: 2006.04.09;
Скачать: CL | DM;
ВнизВзаимодейсвие м/у программами Найти похожие ветки
← →
antonn © (2006-03-06 13:31) [0]имеется 2 программы, мне нужно переслать структуру из одной в другую. Структура такая:
pSI = ^TSI;
TSI = packed record
num: byte;
err:byte;
sCaption: PChar;
sText: PChar;
end;
поля num и err заполняются на стороне отправляющего, у принимающего заполняются sCaption и sText и возвращаются отправляющему. Делаю так:
отправка:var SI:TSI;
begin
SI.num:=0;
SI.err:=1;
SendMessage(hwndWind, WM_USER ,WPARAM(@SI),123);
прием:
procedure WndProc(var message: TMessage); override;
private
....
procedure TForm2.WndProc(var message: TMessage);
begin
case message.Msg of
WM_USER: begin
case Message.LParam of
123: begin
//и уже тут приходит не тот номер (num)
messagedlg(inttostr(pSI(message.WParam).num),mterror,[mbOK],0);
end;
end;
exit;
end;
end;
inherited WndProc(Message);
end;
как правильно передать вышеописанную структуру, кроме как через Tmemorystream+WM_COPYDATA ?
← →
MBo © (2006-03-06 13:33) [1]Если сообщениями- только WM_COPYDATA.
Кроме того, можно через файл, через общую память (MMF) и т.д.
← →
Сергей М. © (2006-03-06 13:34) [2]в случае разных адресных пространств у приемника и у передатчика - никак.
← →
antonn © (2006-03-06 14:05) [3]MBo © (06.03.06 13:33) [1]
Если сообщениями- только WM_COPYDATA.
а как не используя Tstream передать?
ЗЫ извиняюсь, если вопрос совсем тупой
← →
begin...end © (2006-03-06 14:07) [4]> antonn © (06.03.06 14:05) [3]
А TStream-то тут причём?
← →
MBo © (2006-03-06 14:14) [5]TStream тут не обязательно применять. Однако все данные нужно собрать в один блок памяти
← →
MBo © (2006-03-06 14:27) [6]В общем, нужно пересмотреть идеологию.
Запрос с двумя однобайтовыми числами можно послать и обычным WM_USER, только не нужно передавать адрес, который в этом случае бесполезен, а просто объединить в Wparam (как я понял, lparam еще под что-то используется?) оба нужных байта, например, WParam(num or (err shl 8)).
Для передачи sCaption и sText проще всего использовать короткие строки.
← →
antonn © (2006-03-06 14:42) [7]begin...end © (06.03.06 14:07) [4]
А TStream-то тут причём?
не пойму, как без него передать:)
вообще у меня есть структура (просто record) в которой около 6 полей типа integer и около 4х типа shortstring. строки на Pchar я уже от бызъисходности переделал (ведь догадывался, что нельзя просто так залезть в память чужой программы, м/у окнами то оно передавало нормально, а другая программа искала структуру у себя в памяти).
часть от этой структуры я и хотел передавать м/у программами. используя Стрим - все просто, записал, заполнил TCopyDataStruct и кинул через WM_COPYDATA. до меня не дойдет, как переслать не используя этот стрим:)
структура может немного смениться, поэтому требуется более универсальный варинт, нежели планировать под каждый байт место в TMessage. А от стрима хочу отказаться в пользу быстродействия (каждый раз при приеме создаю стрим и в него пишу CopyDataStruct), эти сообщения могут приходить по паре десятков за раз.
← →
begin...end © (2006-03-06 14:49) [8]> antonn © (06.03.06 14:42) [7]
> вообще у меня есть структура (просто record) в которой около
> 6 полей типа integer и около 4х типа shortstring.
См. [6]. Какие из полей этой структуры должны отправляться для запроса, и какие -- заполняться в ответ на запрос? Реальное описание структуры приведите.
← →
antonn © (2006-03-06 15:01) [9]
TS = record
num: byte; //эти передаю
err:byte;
//эти возвращаются
x,y:integer;
tCh,tTh,tDh:integer;
sCaption: shortstring;
sText: shortstring;
sDate: shortstring;
sName: shortstring;
end;
я планировал в SendMessage() отправлять структуру, и тут же получать обратно (не через отдельную посылку). вообще, в num - номер элемента в массиве, в err возможная реакция на ошибку (ну там ошибку вывести диалогом или в передаваемую часть записать что то свое...).
← →
antonn © (2006-03-06 15:19) [10]antonn © (06.03.06 15:01) [9]
я планировал в SendMessage() отправлять структуру, и тут же получать обратно
хе-хе, а разве с WM_COPYDATA так можно? :)
как с caption:=inttostr(SendMessage(hwndWind, WM_USER ,1,123));
вроде нельзя, все равно через другую посылку нужно отправлять...
← →
Leonid Troyanovsky © (2006-03-06 15:34) [11]
> antonn © (06.03.06 14:42) [7]
> вообще у меня есть структура (просто record) в которой около
> 6 полей типа integer и около 4х типа shortstring. строки
> на Pchar я уже от бызъисходности переделал (ведь догадывался,
> что нельзя просто так залезть в память чужой программы,
> м/у окнами то оно передавало нормально, а другая программа
> искала структуру у себя в памяти).
Делается memory mapped file, в него записывается необходимая
информация. Хендл mmf можно передать между процессами
с помощью DuplicateHandle & SendMessage.
--
Regards, LVT.
Страницы: 1 вся ветка
Текущий архив: 2006.04.09;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.012 c