AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi [DLL] Problem mit langem String als PChar
Thema durchsuchen
Ansicht
Themen-Optionen

[DLL] Problem mit langem String als PChar

Ein Thema von Zwoetzen · begonnen am 15. Mai 2011 · letzter Beitrag vom 15. Mai 2011
Antwort Antwort
Zwoetzen

Registriert seit: 19. Sep 2007
Ort: Ilmenau
93 Beiträge
 
Delphi 2009 Professional
 
#1

[DLL] Problem mit langem String als PChar

  Alt 15. Mai 2011, 10:21
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: [DLL] Problem mit langem String als PChar

  Alt 15. Mai 2011, 10:37
Du hast immer einen Pufferüberlauf, egal wie lang der String ist ... die 8 KB (4000 Zeichen) sind reiner Zufall, daß es da knallt.

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (15. Mai 2011 um 10:47 Uhr)
  Mit Zitat antworten Zitat
Zwoetzen

Registriert seit: 19. Sep 2007
Ort: Ilmenau
93 Beiträge
 
Delphi 2009 Professional
 
#3

AW: [DLL] Problem mit langem String als PChar

  Alt 15. Mai 2011, 11:03
Ah, danke. Ich hatte schon wieder verdrängt gehabt, dass der Char in D2009 ja breiter geworden ist 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
  Mit Zitat antworten Zitat
Benutzerbild von Cirec
Cirec

Registriert seit: 23. Sep 2010
Ort: Frankreich
7 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: [DLL] Problem mit langem String als PChar

  Alt 15. Mai 2011, 12:19
Hallo,
Ah, danke. Ich hatte schon wieder verdrängt gehabt, dass der Char in D2009 ja breiter geworden ist

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz