Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.032 c
15-1142623140
Fl@sh
2006-03-17 22:19
2006.04.09
Клиент Банк


15-1142407750
Alex.
2006-03-15 10:29
2006.04.09
Enterprise Manager для Oracle 10 g


1-1141576572
ZeFiR
2006-03-05 19:36
2006.04.09
Чтение запись в оперативку или как написать тренер для игры...


1-1141461972
Kristmas
2006-03-04 11:46
2006.04.09
DragDrop в Virtual VistView


2-1143534359
Barksy
2006-03-28 12:25
2006.04.09
Какую клиент-серверную базу выбрать?