AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung

Ein Thema von schand99 · begonnen am 25. Jul 2016 · letzter Beitrag vom 27. Jul 2016
Antwort Antwort
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
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zugriffsverletzung

  Alt 25. Jul 2016, 09:49
Und was ist, wenn das if else if konstrukt nicht zustimmt?
Dann wird ein nicht initialisierter Wert übergeben.
Denn ein abschliessendes else oder eine Initialisierung der Variable Refr findet nicht statt.
Chris
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Zugriffsverletzung

  Alt 25. Jul 2016, 10:37
Wenn ich mich nicht verlesen habe sollte ein simples LowerCase bzw. sein entsprechendes Pendant dieses If..else if..else if - Monstrum ersetzen können.

Und ansonsten frag mal den Debugger wo es da ein Problem gibt [F7] sollte da sehr hilfreich sein.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Zugriffsverletzung

  Alt 25. Jul 2016, 10:57
Vielleicht hilfts ja : http://www.studfiles.ru/preview/3378435/
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Zugriffsverletzung

  Alt 25. Jul 2016, 11:02
Gib mal die Parameter in eine Log-Datei aus und prüfe dort, ob das Erwartete übergeben wird.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
schand99

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

AW: Zugriffsverletzung

  Alt 25. Jul 2016, 12:03
Schon mal Danke für die Hinweise.

Es ist sichergestellt, dass 'Refr' niemals leer ist. 'FType' enthält immer den Name des Kältemittels, das wird schon vor dem Aufrufen der Funktion sichergestellt.
Das mit dem if... else if... sieht nicht schön aus und es macht für die DLL auch keinen Unterschied ob Groß- oder Kleinbuchstaben übergeben werden. Allerdings, und das ist auch etwas was ich nicht verstehe, wenn ich der Pointer-Variablen "Refr" unter Verwendung von Refr := PAnsiChar(FType) den String zuweise, dann funktioniert die DLL nicht, gibt immer 0 zurück.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz