Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
Delphi 2007 Professional
|
WM_COPYDATA mit Records und Arrays
16. Okt 2007, 09: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
|
|
Zitat
|