Einzelnen Beitrag anzeigen

hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Delphi-DLL mit PAnsiChar: Zugriffsverletzung bei Freigabe

  Alt 25. Mär 2019, 06:06
Moin,
erst einmal Danke für die bisherigen Antworten.


Wozu soll HoleSpeicher gut sein? Du allozierst Speicher (übrigens zu wenig, denn du vergisst das #0-Zeichen am Ende), der dann irgendwann wieder freigegeben werden muss, aber wofür?

Mache es doch nicht schwieriger als es ist, sondern einfach so:

Delphi-Quellcode:
function UserHatRecht(cObj, cRecht: string): Boolean;
begin
  Result := DLL_UserHatRecht(PAnsiChar(AnsiString(cObj)), PAnsiChar(AnsiString(cRecht)));
end;
Es wäre anders, wenn du die Strings als Rückgabe-Puffer benötigen solltest, aber das ist ja hier nicht der Fall.

Übrigens, du solltest mal meinen Artikel (nur in English, sorry) über DLLs lesen: DLL dos and don'ts. Da steht auch, wie man Puffer übergeben kann.
Der Hinweis mit dem zu kleinen Speicher wars. Jetzt scheint es zu laufen.

Die Funktion habe ich als Verzweiflungstat eingeführt, weil meine vorherigen Versuche alles mögliche ergaben, nur nicht das erwünschte. Unter anderem stand in einer Version in allen Parametern das gleiche. Inzwischen ist mir klar, was ich dort falsch gemacht habe, doch da hatte ich bereits die Funktion eingebaut und die meisten Stellen geändert.

Danke für den Link, ich werde ihn mir gleich in aller Ruhe zu Gemüte führen.

Hallo,
was mir komisch vorkommt.
Du sprichst überall von Ansi, hier aber benutzt du den normalen Delphi-String.

cObj := String(cPObj);

Und benutzt z.B. nicht deine StrLCopies, um den String zu füllen.
cObj liegt ja auf dem Stack und wird "hinter" dem end freigegeben.
Was dann mit cPObj ist, mag ich mir gerade nicht ausdenken ...
Die Parameter sind alle in PAnsiChar, da allerdings die eigentlichen Funktionen zum Teil andere Funktionen nutzen, die wiederum Strings erwarten/liefern, habe ich die Parameter wieder in Strings gewandelt. Ich muss allerdings gestehen, dass mir nicht ganz klar ist, was Delphi hier wirklich macht: Eigentlich müsste doch Delphi für cObj einen komplett neuen Speicherbereich anlegen und bei der Zuweisung von String(cPobj) den Inhalt aus cPObj in cOBJ kopieren, oder etwa nicht? Schließlich ist cObj ein Unicode-String und damit doppelt so groß wie der AnsiString in cPObj
StrLCopy wäre doch hier dann eh falsch, da es mit (P)AnsiChar arbeitet?

Gruß
hsg
  Mit Zitat antworten Zitat