Einzelnen Beitrag anzeigen

schand99

Registriert seit: 7. Nov 2013
Ort: Südtirol
43 Beiträge
 
Delphi XE8 Enterprise
 
#1

Zugriffsverletzung

  Alt 25. Jul 2016, 09:29
Delphi-Version: 5
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 = 'R404Athen
      Refr := PAnsiChar('r404a')
   else if FType ='R407Cthen
      Refr := PAnsiChar('r407c')
   else if FType ='R134Athen
      Refr := PAnsiChar('r134a')
   else if FType ='R410Athen
      Refr := PAnsiChar('r410a')
   else if FType ='R507then
      Refr := PAnsiChar('r507')
   else if FType ='R22then
      Refr := PAnsiChar('r22');

   if Uppercase(FName) = 'S_TCthen
      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
  Mit Zitat antworten Zitat