![]() |
[DLL] Problem mit langem String als PChar
Hallo Delphianer,
ich habe mich in den letzten Tagen mit DLLs befasst, einfach weil ich mit denen noch keinerlei Erfahrung hatte und deren Funktionsweise kennen lernen wollte. Allerdings bin ich nun auf ein Problem gestoßen, wo ich nicht weiter weiß: Ich habe eine Funktion, die einen PChar entgegennimmt, diesen leicht verändert und zurück gibt, nach ![]() Mein aktueller Code: DLL:
Delphi-Quellcode:
Hauptprogramm:
function func1(s: PChar; Buffer: PChar; lenBuffer: Integer): Integer; stdcall;
var foo: String; begin // Strings aneinanderhängen foo := 'foo'+ s; // nur String in Buffer kopieren, wenn Buffer nicht nil ist if Assigned(Buffer) then StrLCopy(Buffer, PChar(foo), lenBuffer); // auf alle Fälle immer Länge des Strings zurückgeben result := length(foo); end;
Delphi-Quellcode:
Kann mir jemand auf die Sprünge helfen? ^^
var
Len: Integer; Buffer: PChar; S: String; begin S := GetSehrLangerString(); Len := func1(PChar(S), nil, 0); try GetMem(Buffer, Len + 1); Len := func1(PChar(S), Buffer, Len + 1); ShowMessage(Buffer); // <- Hier kommt es zum "Stack Overflow" finally FreeMem(Buffer); end; end; MfG Zwoetzen |
AW: [DLL] Problem mit langem String als PChar
Du hast immer einen Pufferüberlauf, egal wie lang der String ist ... die 8 KB (4000 Zeichen) sind reiner Zufall, daß es da knallt.
Delphi-Quellcode:
.
GetMem(Buffer, (Len + 1) * SizeOf(Char));
PS: Das GetMem gehört vor das Try, denn wenn es schon beim Try knallt, dann hast du ein hier Problem, mit einer verfäschten Fehlermeldung. GetMem > OutOfMemory > finally > Fehler beim Freigeben des Nichtexistierenden und nicht initialisierten Buffer.
Delphi-Quellcode:
GetMem > OutOfMemory > finally wird nicht ausgeführt > OutOfMemory
resservieren;
try ... finally freigeben; end; Statt GetMem und FreeMem solltest du hier vielleicht auch besser auf was Anderes ausweichen ... ich weiß zwar grad nicht mehr was, aber es gibt irgendwo Equivalente dafür, welche die Länge in Chars und nicht in Bytes annehmen und PChar/PAnsiChar/PWideChar zurückgeben. |
AW: [DLL] Problem mit langem String als PChar
Ah, danke. Ich hatte schon wieder verdrängt gehabt, dass der Char in D2009 ja breiter geworden ist :oops: Mit dem SizeOf funktioniert es nun ;)
Und das GetMem stand nur innerhalb des try, weil es auf der verlinkten Seite so war und ich das einfach schnell nochmal rauskopiert hatte. Ansonsten setze ich das Reservieren auch immer vor das try ;) |
AW: [DLL] Problem mit langem String als PChar
Hallo,
Zitat:
ist aber so !! Bis D2007 --> SizeOf(Char) == 1 PChar zeigt auf PAnsiChar & Char auf AnsiChar Zeit D2009 --> SizeOf(Char) == 2 PChar zeigt auf PWideChar & Char auf WideChar |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz