Einzelnen Beitrag anzeigen

Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Delphi-DLL mit PAnsiChar: Zugriffsverletzung bei Freigabe

  Alt 22. Mär 2019, 21:46
Hallo,

Im DelphiProgramm steht dann folgendes:
Delphi-Quellcode:
interface

  Function UserHatRecht( cObj, cRecht : string): Boolean;
  Function DLL_UserHatRecht( cObj, cRecht : PAnsiChar): Boolean; stdCall; external 'FSGVBA.dllname 'UserHatRecht';

implementation

function HoleSpeicher( cVal : string) : PAnsiChar;
var
  pPtr : Pointer;
  nLen : Integer;
  cAVal : AnsiString;
begin
  cAVal := AnsiString(cVal);
  nLen := Length(cAVal);
  GetMem( pPtr, nLen);
  StrLCopy(pPtr, PAnsiChar(cAVal), nLen);
  Result := pPtr;
end;

Function UserHatRecht( cObj, cRecht : string): Boolean;
var
  pO, pR : PAnsiChar;
begin
  // Vorbereitung:
  pO := HoleSpeicher(cObj);
  pR := HoleSpeicher(cRecht);
  // Ausführung:
  Result := DLL_UserHatRecht(pO, pR);
  // Aufräumen:
  FreeMem(pO); // <-- hier kommt die Zugriffsverletzung
  FreeMem(pR);
end;
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.
Rudy Velthuis

Geändert von Rudy Velthuis (23. Mär 2019 um 15:35 Uhr)
  Mit Zitat antworten Zitat