Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2017, 13:49   #1
Elenik
Пользователь
 
Регистрация: 22.03.2013
Сообщений: 23
По умолчанию SendMessage для передачи данных Record

Здравствуйте!
Подскажите, пожалуйста, возможна передача данных типа record между приложениями. Передача простого текстового сообщения происходит без проблем, а структуру передать не удается. Для написания кодов использовала инфу с сайта http://delphiru.ru/other/14--.html

Пример кода для отправки данных:
SenderApp.zip

Пример кода приема данных:
ReceiverApp.zip

Приходит какой-то мусор. Подскажите, где ошибка?
Elenik вне форума Ответить с цитированием
Старый 25.04.2017, 14:34   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

У вас в проекте ReceiverApp
в процедуре
Код:
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
написано так
Код:
with Msg.CopyDataStruct^ do ms.Write(lpdata^, cbdata);
          ms.Position := 0;
    --> ms.WriteBuffer(MyDataExp,Msg.CopyDataStruct.cbdata);
          EdPath.Text:=MyDataExp.stPath;
          EdIzd.Text:=MyDataExp.stIzd;
а нужно так
Код:
with Msg.CopyDataStruct^ do ms.Write(lpdata^, cbdata);
          ms.Position := 0;
    --> ms.ReadBuffer(MyDataExp,Msg.CopyDataStruct.cbdata);
          EdPath.Text:=MyDataExp.stPath;
          EdIzd.Text:=MyDataExp.stIzd;
Вы должны читать данные если у вас это модуль приема

Последний раз редактировалось Aliens_wolfs; 25.04.2017 в 14:43.
Aliens_wolfs вне форума Ответить с цитированием
Старый 25.04.2017, 14:48   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
а нужно так
ms.ReadBuffer(MyDataExp,Msg.CopyDat aStruct.cbdata);
это вряд ли!

ms.ReadBuffer(MyDataExp,Msg.CopyDat aStruct.cbdata)
означает, что нужно прочитать данные из MyDataExp и записать их в поток ms
а тут как раз нужно прочитать данные из потока и записать из в MyDataExp
а это как раз WriteBuffer.

тогда уже наоборот, при отправке данных в Sender.pas

нужно:
Цитата:
Код:
      ms := TMemoryStream.Create;
      try
        ms.WriteBuffer(MyDataExp, SizeOf(MyDataExp));
        cbData := ms.Size;
        lpData := ms.Memory;
Код:
      ms := TMemoryStream.Create;
      try
        ms.ReadBuffer(MyDataExp, SizeOf(MyDataExp));
        cbData := ms.Size;
        lpData := ms.Memory;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.04.2017, 16:13   #4
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

А ну да поторопился и не все увидел)
Aliens_wolfs вне форума Ответить с цитированием
Старый 26.04.2017, 08:41   #5
Elenik
Пользователь
 
Регистрация: 22.03.2013
Сообщений: 23
По умолчанию

Спасибо за отклик.

Думаю, что прав Aliens_wolfs. Ведь ReadBuffer предназначен для чтения содержимого потока в переменную, а WriteBuffer - для записи данных из переменной в поток. Поэтому я в проге ReceiverApp сделала чтение из потока в структуру. Но, к сожалению, не помогло - по-прежнему приходит мусор.
Есть еще какие-нибудь предложения?

P.S. А если в Sender сделать
Код:
ms.ReadBuffer(MyDataExp, SizeOf(MyDataExp));
, то вылетает ошибка:
Error.png

Ведь в поток еще ничего не записали, а хотим что-то прочитать.

Последний раз редактировалось Elenik; 26.04.2017 в 08:47.
Elenik вне форума Ответить с цитированием
Старый 26.04.2017, 09:27   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Elenik Посмотреть сообщение
Думаю, что прав Aliens_wolfs. Ведь ReadBuffer предназначен для чтения содержимого потока в переменную, а WriteBuffer - для записи данных из переменной в поток.
да, согласен, я был не прав.


Цитата:
Сообщение от Elenik Посмотреть сообщение
Но, к сожалению, не помогло - по-прежнему приходит мусор.
Ну, тогда всё намного хуже.
в случае текста через SendMessage отправляется PChar() - это указатель на набор символов в памяти, которые заканчиваются нулём.
А в случае записи Вы отправляете ms.Memory - это указатель. Но вот на что он указывает и есть ли там ноль в конце - это большой вопрос!
Попробуйте преобразовать MyDataExp в PChar()
ну, для начала, я бы попробовал так:
Код:
        cbData := ms.Size+1;
        lpData := PChar(ms.memory);

Последний раз редактировалось Serge_Bliznykov; 26.04.2017 в 09:45.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2017, 10:30   #7
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Код:
type
  PDataExp = ^TDataExp;
  TDataExp = packed record
    stPath: string[100];
    stIzd: string[5];
  end;
Код:
//Sender
procedure TForm1.Button1Click(Sender: TObject);
var
  MyCopyDataStruct: TCopyDataStruct;
  hTargetWnd: HWND;
  MyDataExp: TDataExp;
begin
  hTargetWnd := HandleWindow('Reciev');
  if hTargetWnd = 0 then
  begin
    ShowMessage('No Recipient found!');
    Exit;
  end;

  with MyCopyDataStruct do
  begin
    case cmbType.ItemIndex of
      0:
        begin
          dwData := 0;
          cbData := (Length(EdPath.Text) + 1) * SizeOf(Char);
          lpData := Pointer(EdPath.Text);
        end;
      1:
        begin
          with MyDataExp do
          begin
            stPath := EdPath.Text;
            stIzd := EdIzd.Text;
          end;
          dwData := 1;
          cbData := SizeOf(TDataExp);
          lpData := @MyDataExp;
        end;
    end;
  end;
  SendMessage(hTargetWnd, WM_COPYDATA, Handle, LPARAM(@MyCopyDataStruct));
end;
Код:
//Receiver
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
  sText: string;
  MyDataExp: TDataExp;
begin
  case Msg.CopyDataStruct.dwData of
    0:
      begin
        sText := PChar(Msg.CopyDataStruct.lpData);
        EdPath.Text := sText;
      end;
    1:
      begin
        MyDataExp := PDataExp(Msg.CopyDataStruct.lpData)^;
        EdPath.Text := MyDataExp.stPath;
        EdIzd.Text := MyDataExp.stIzd;
      end;
  end;
end;

Последний раз редактировалось Filka; 26.04.2017 в 10:33.
Filka вне форума Ответить с цитированием
Старый 26.04.2017, 10:54   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Filka, круто!!!
(впрочем, как всегда!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2017, 11:01   #9
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Спасибо
Filka вне форума Ответить с цитированием
Старый 26.04.2017, 11:10   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Но работает же через Stream в рамках одной проги. Какого в другой проге искажается?
Код:
type TDataExp = packed record
       stPath: string[100];
       stIzd: string[5];
     end;

procedure TForm1.Button3Click(Sender: TObject);
var ms,ms1: TMemoryStream;
    MyDataExp,MyDataExp1: TDataExp;
begin
  MyDataExp.stPath:='c:\тра-ля-ля';
  MyDataExp.stIzd:='123';
  ms:=TMemoryStream.Create;
  ms.WriteBuffer(MyDataExp, SizeOf(TDataExp));

  ms1:=TMemoryStream.Create;
  ms1.WriteBuffer(ms.Memory^, ms.Size);
  ms1.Position:=0;
  ms1.ReadBuffer(MyDataExp1,ms1.Size);
  ms.Free;
  ms1.Free;

  Memo1.Lines.Add(MyDataExp1.stPath);
  Memo1.Lines.Add(MyDataExp1.stIzd);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что надо записать в регистры UART для передачи данных через сом порт? седьмой Общие вопросы C/C++ 3 23.06.2017 15:26
Какие методы есть для передачи данных? habibi_arabian Общие вопросы Delphi 2 20.09.2015 19:05
обеспечение связи двух удаленных подразделений для передачи данных sunriser Помощь студентам 4 03.10.2013 13:09
Бот для передачи данных между сайтами Conq PHP 6 03.10.2011 23:34
Макрос для передачи персанальных данных Evroclidon Microsoft Office Excel 19 01.02.2010 21:12