Einzelnen Beitrag anzeigen

Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#1

WM_COPYDATA mit Records und Arrays

  Alt 16. Okt 2007, 08:37
Hallo zusammen,

irgendwie seh ich nicht den Fehler den ich grad mache,
vielleicht weiss einer von euch Rat.

Ich sende mit WM_COPYDATA einen Record, beim Empfang ist mein Array nicht mehr gültig und ich frag mich grad warum. Glaube ich bin grad Codeblind.

Auf eine Form einen Button, einen Edit und ein Memo anbringen zum Testen.


Sender:
Delphi-Quellcode:
type
TBytes = array of Byte;
PBytes = ^TBytes;


PMyData = ^TMyData;
TMyData = packed record
  Data1 : DWord;
  Data2 : Word;
  ArrayData : PBytes;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var LCopyDataStruct: TCopyDataStruct;
    LArray: PBytes;
    i: Integer;

    LStr: string;
    FensterH: HWND;
    LAnzahl: Integer;
begin
  LCopyDataStruct.cbData := StrToInt(Edit1.Text); //Anzahl
  LCopyDataStruct.dwData := self.Handle;
  LAnzahl := LCopyDataStruct.cbData;

  if assigned(LCopyDataStruct.lpdata) then
    ReallocMem(LCopyDataStruct.lpData, SizeOf(DWord) + SizeOf(Word) + LAnzahl * SizeOf(Byte))
  else
    LCopyDataStruct.lpData := AllocMem(SizeOf(DWord) + SizeOf(Word) + LAnzahl * SizeOf(Byte));

  Memo1.lines.add('');
  Memo1.lines.add('Sende:');
  Memo1.lines.add('cbData = ' + Edit1.Text);
  Memo1.lines.Add('dwData = ' + IntToStr(self.Handle));

  if assigned(LArray) then
    ReAllocMem(LArray, 4)
  else
    LArray := AllocMem(4);

  SetLength(LArray^, LCopyDataStruct.cbData);

  for i := 0 to LCopyDataStruct.cbData -1 do
  begin
    LArray^[i] := Random(200);
    LStr := LStr + ' ' + IntToStr(LArray^[i]);
  end;
  Memo1.Lines.Add('Daten:');
  Memo1.Lines.Add(LStr);


  PMyData(LCopydataStruct.lpData)^.ArrayData := Allocmem(4);
  SetLength(PMyData(LCopydataStruct.lpData)^.ArrayData^, LCopyDataStruct.cbData);
  move(LArray^[0], PMyData(LCopydataStruct.lpData)^.ArrayData^[0], LCopyDataStruct.cbData);

  FensterH := FindWindow(nil, PChar('DataSend2'));
  SendMessage(FensterH, WM_COPYDATA, 0, LongInt(@LCopyDataStruct));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize();
end;

procedure TForm1.CopyData(var AMsg: TWMCopyData);
var i: Integer;
    LStr: string;
    LArray: PBytes;
    LAnzahl: integer;
begin
   Memo1.lines.add('');
   Memo1.Lines.Add('Empfangen :');

   Memo1.Lines.add('cbData : '+ IntToStr(AMsg.copyDatastruct^.cbData)); //Anzahl
   Memo1.Lines.Add('dwData : '+ IntToStr(Amsg.CopyDataStruct^.dwData)); //Fensterhandle


   LAnzahl := Amsg.CopyDataStruct^.dwData;

   Memo1.Lines.add('Daten:');

   if assigned(LArray) then
     ReallocMem(LArray, 4)
   else
     LArray := AllocMem(4);

   SetLength(LArray^, LAnzahl);

   move(PMyData(Amsg.copydatastruct^.lpdata)^.ArrayData^[0], LArray^[0], LAnzahl);

   for i := 0 to AMsg.CopydataStruct^.cbData -1 do
   begin
     LStr := LStr + IntToStr(LArray^[i]);
   end;
end;

Empfänger:

Delphi-Quellcode:
type
TBytes = array of Byte;
PBytes = ^TBytes;


PMyData = ^TMyData;
TMyData = packed record
  Data1 : DWord;
  Data2 : Word;
  ArrayData : PBytes;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var LCopyDataStruct: TCopyDataStruct;
    LArray: PBytes;
    i: Integer;

    LStr: string;
    FensterH: HWND;
    LAnzahl: integer;
begin
  LCopyDataStruct.cbData := StrToInt(Edit1.Text); //Anzahl
  LCopyDataStruct.dwData := self.Handle;


  LAnzahl := LCopyDataStruct.cbData;

  if assigned(LCopyDataStruct.lpdata) then
    ReallocMem(LCopyDataStruct.lpData, 6 + LAnzahl)
  else
    LCopyDataStruct.lpData := AllocMem(6 + LAnzahl);

  Memo1.lines.add('');
  Memo1.lines.add('Sende:');
  Memo1.lines.add('cbData = ' + Edit1.Text);
  Memo1.lines.Add('dwData = ' + IntToStr(self.Handle));

  if assigned(LArray) then
    ReAllocMem(LArray, 4)
  else
    LArray := AllocMem(4);
  SetLength(LArray^, LCopyDataStruct.cbData);

  for i := 0 to LCopyDataStruct.cbData -1 do
  begin
    LArray^[i] := Random(200);
    LStr := LStr + ' ' + IntToStr(LArray^[i]);
  end;
  Memo1.Lines.Add('Daten:');
  Memo1.Lines.Add(LStr);

  PMyData(LCopydataStruct.lpData)^.ArrayData := AllocMem(4);
  SetLength(PMyData(LCopydataStruct.lpData)^.ArrayData^, LCopyDataStruct.cbData);
  move(LArray^[0], PMyData(LCopydataStruct.lpData)^.ArrayData^[0], LCopyDataStruct.cbData);

  FensterH := FindWindow(nil, PChar('DataSend1'));
  SendMessage(FensterH, WM_COPYDATA, 0, LongInt(@LCopyDataStruct));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize();
end;

procedure TForm1.CopyData(var AMsg: TWMCopyData);
var i: Integer;
    LStr: string;
    LAnzahl: integer;
    LArray: PBytes;
begin
   Memo1.lines.add('');
   Memo1.Lines.Add('Empfangen :');

   Memo1.Lines.add('cbData : '+ IntToStr(AMsg.copyDatastruct^.cbData)); //Anzahl
   Memo1.Lines.Add('dwData : '+ IntToStr(Amsg.CopyDataStruct^.dwData));



   Memo1.Lines.add('Daten:');

   LAnzahl := Amsg.CopyDataStruct^.cbData;

   if assigned(LArray) then
     ReallocMem(LArray, 4)
   else
     LArray := AllocMem(4);

   SetLength(LArray^, LAnzahl);

   move(PMyData(Amsg.copydatastruct^.lpdata)^.Arraydata^[0], LArray^[0], LAnzahl); //<- hier ist das Array nicht mehr gültig und es gibt eine AccessViolation

   for i := 0 to AMsg.CopydataStruct^.cbData -1 do
   begin
     LStr := LStr + IntToStr(LArray^[i]);
   end;
end;
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat