Hallo liebe Entwickler,
ich habe ein Problem mit Zugriffsverletzungen beim Aufrufen von Funktionen aus einer
DLL. Die
DLL "ref_calc32.dll" dient zum Berechnen von Stoffwertdaten von Kältemitteln, eine Dokumentation zu der
DLL habe ich leider nicht. Nur ein Quellcodebeispiel geschrieben mit VB 6.0
Daraus konnte ich mir mit viel Probieren die Funktionen der
DLL in Delphi einbinden
Zum Beispiel:
Delphi-Quellcode:
Function S_vs(ref: PAnsiChar; t, P: Double; var vs: Double): Boolean; stdcall; external DllName;
Function S_t_d(ref: PAnsiChar; P: Double; var T_d: Double): Boolean; stdcall; external DllName;
usw.
Zusätzlich habe ich alle
DLL-Aufrufe in eine einzelne Funktion gepackt, um Probleme mit Variablen weitestgehend zu vermeiden.
Delphi-Quellcode:
Function UDllCall(FType, FName: String; TKM, XVar: Double): Double;
Var
Temp, res: Double;
Refr: PAnsiChar;
Erg: Boolean;
Begin
//GetMem(Refr, 16);
Temp := 273.15 + TKM;
// Berechnen der Stoffwerte
if FType = 'R404A' then
Refr := PAnsiChar('r404a')
else if FType ='R407C' then
Refr := PAnsiChar('r407c')
else if FType ='R134A' then
Refr := PAnsiChar('r134a')
else if FType ='R410A' then
Refr := PAnsiChar('r410a')
else if FType ='R507' then
Refr := PAnsiChar('r507')
else if FType ='R22' then
Refr := PAnsiChar('r22');
if Uppercase(FName) = 'S_TC' then
Begin
erg := S_tc(Refr, res);
End;
// usw, usw, ...
Result := res;
End;
Allerdings bleibt ein Problem bestehen: eine Schutzverletzung. Diese tritt erst beim 62. Aufruf der Funktion auf. Und zwar nach dem 'end;' und betrifft die Freigabe von reserviertem Speicher. Ich vermute einen Zusammenhang mit der Variablen "Refr" vom Typ PAnsiChar. Ich habe auch schon versucht mit GetMem und FreeMem den für die Variable reservierten Speicherbereich zu reservieren und freizugeben. Alles ohne Erfolg.
Hat vielleicht jemand von Euch Delphiprofis einen Tipp?
schon mal vielen Dank,
Andreas