Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.588 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 1. Okt 2016, 13:24
// EDIT: hatte den Tab wohl zu lange offen, ich lasse es mal trotzdem so

Ich frage mich wie das jemals funktioniert hat. Vielleicht gab es vorher ein anderes Move als System.Move?

Move bekommt einen Puffer als ersten Parameter, d.h. du müsstest das erste Zeichen übergeben, nicht den String (was intern ja ein Pointer ist). Und warum das +1 bei der Größe? So schreibst du die eine Hälfte des Nullzeichens mit in die Datei!?

Dazu kommt, dass WriteFile genau wie Move im zweiten Parameter einen Puffer übergeben bekommt und keinen Pointer auf die Daten.
Eventuell hat sich diese Deklaration in Delphi irgendwann geändert.

So wäre es korrekt:
Delphi-Quellcode:
var
  Buffer : Pointer;
  Msg : String;
  dwSize : DWORD;
  dwBW : DWORD;
...
  dwSize := Length(Msg) * SizeOf(Char);
  dwBW := 0;
  GetMem(Buffer, dwSize);
  Move(Msg[1], Buffer^, dwSize);
  Result := WriteFile(FHandle, Buffer^, dwSize, dwBW, nil);
  FileClose(FHandle);
  FreeMem(Buffer, dwSize);
Allerdings frage ich mich warum du das so kompliziert machst. Warum nicht einfach so?
Delphi-Quellcode:
var
  Msg : String;
  dwSize : DWORD;
  dwBW : DWORD;
...
  dwSize := Length(Msg) * SizeOf(Char);
  dwBW := 0;
  Result := WriteFile(FHandle, Msg[1], dwSize, dwBW, nil);
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat