Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

Взаимодейсвие м/у программами   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
15-1142345654
ZeFiR
2006-03-14 17:14
2006.04.09
Эмуляторы для запуска sis файлов(приложения нокия-смартов)


3-1139920807
Tornado
2006-02-14 15:40
2006.04.09
Помогите обработать событие


2-1143032440
Физик
2006-03-22 16:00
2006.04.09
Как запритить звуковой карте воспроизводить звук


1-1141736802
aleshap
2006-03-07 16:06
2006.04.09
Помогите вернуть курсор......


2-1143027125
s_t_d
2006-03-22 14:32
2006.04.09
Коды клавишей управления курсором





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский