Autor Beitrag
Hami04
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 16.09.09 14:54 
Hallo,
ich habe eine Frage zu Strings und DLLs bzw. zum Casting von PChar in String.
Ich habe eine DLL, die mir einen PChar als Ergebnis liefert. Den Speicherbereich des PChars habe ich vorher selbst angelegt. Anschließend caste ich den PChar in einen String.

Jetzt meine Frage: Wird bei diesem Cast eine Kopie erstellt oder wird einfach nur mit der Adresse gearbeitet? Wenn eine Kopie erstellt wird, muss der Speicher des PChars wieder freigegeben werden. Wird keine Kopie erstellt, erhöht sich der String-Zähler und der Speicherbereich wird automatisch freigegeben, richtig?

Zur Veranschaulichung ein bisschen Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function Read_STRING(Handle: THandle): string;
var
  Buffer: PChar;
  BufferLength: Int64;
begin
  BufferLength := Read_STR(Handle, Nil, 0);
  GetMem(Buffer, BufferLength + 1);
  Read_STR(Handle, Buffer, BufferLength);
  Result := string (Buffer);
  //FreeMem(Buffer);
end;

Entscheidend ist die auskommentierte Zeile. Ist sie nötig oder nicht?


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 16.09.2009 um 23:09
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.09.09 22:12 
Moin und :welcome: im Forum!

Ich würd´s einfach so machen: :nixweiss:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function Read_STRING(Handle: THandle): String;
begin
  SetLength(Result,Read_STR(Handle, Nil, 0)); // Speicher holen
  Read_STR(Handle, PChar(Result)^, Length(Result)); // Speicher befüllen lassen
end;
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Do 17.09.09 00:51 
Der Speicher muss freigegeben werden, es wird eine Kopie erstellt.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
Hami04 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 18.09.09 11:30 
Alles klar.
Danke Euch Beiden. Das mit dem Speicherfreigeben erschien mir auch so, aber jetzt bin ich sicher.
Die Lösung von Narses ist natürlich noch ein bisschen eleganter. Ich werde es dann so machen.

Allen ein schönes Wochenende