Hallo,
ich bin gerade mal wieder leicht am Verzweifeln. Ich erstelle zurzeit eine Delphi-
DLL mit einem ganzen Haufen von Funktionen, die sowohl in einem Delphi-Programm als auch in VBA genutzt werden sollen. Daher verwende ich in der
DLL AnsiString bzw. PAnsiChar zur Übergabe von String-Parametern.
Die größten Hindernisse habe ich dabei bereits umschifft, doch im Moment kämpfe ich mit einem Phänomen, das ich mir nicht erklären kann.
Die
DLL-Funktion sieht dabei wie folgt aus:
Delphi-Quellcode:
Function UserHatRecht(cPObj, cPRecht : PAnsiChar): Boolean;
stdCall;
var
cSql :
String;
lResult : Boolean;
cObj, cRecht :
String;
begin
cObj :=
String(cPObj);
cRecht :=
String(cPRecht);
Result := false;
lResult := False;
// mittelglroßes SQL-Statement entfernt,
Result := lResult;
end;
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;
Kommentiere ich die Zeile aus, in der die Zugriffsverletzung passiert, läuft das Programm ohne Probleme weiter.
Ich rufe an anderen Stellen bereits andere Funktionen aus der
DLL auf, bei der zum Teil sogar Strings zurückgegeben und deutlich mehr Parameter an die
DLL übergeben werden, ohne dass etwas passiert. Nur bei dieser Funktion knallt es.
Irgendjemand eine Idee, was hier schiefläuft?
Gruß
hsg