Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi [DLL] Problem mit langem String als PChar (https://www.delphipraxis.net/160473-%5Bdll%5D-problem-mit-langem-string-als-pchar.html)

Zwoetzen 15. Mai 2011 10:21

[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 diesem Vorbild, erstellt. Doch wenn ich aus der DLL einen String (PChar) verarbeiten will, der etwas länger ist (die Grenze scheint irgendwo bei 4k Zeichen zu liegen), bekomme ich in meiner Anwendung nurnoch eine StackOverflow-Meldung, wenn ich den String weiter verwenden will.

Mein aktueller Code:

DLL:
Delphi-Quellcode:
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;
Hauptprogramm:
Delphi-Quellcode:
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;
Kann mir jemand auf die Sprünge helfen? ^^


MfG Zwoetzen

himitsu 15. Mai 2011 10:37

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:
resservieren;
try
  ...
finally
  freigeben;
end;
GetMem > OutOfMemory > finally wird nicht ausgeführt > OutOfMemory


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.

Zwoetzen 15. Mai 2011 11:03

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 ;)

Cirec 15. Mai 2011 12:19

AW: [DLL] Problem mit langem String als PChar
 
Hallo,
Zitat:

Zitat von Zwoetzen (Beitrag 1100881)
Ah, danke. Ich hatte schon wieder verdrängt gehabt, dass der Char in D2009 ja breiter geworden ist :oops:


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