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.dll' name '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.