AW: Zugriffsverletzung
Boolean und WordBool sind beide logische Variablentypen. Boolean belegt ein 1 Byte, WordBool 2. Soviel sagt die Doku von Embarcadero.
Hatte in meinem Programm schon auf WordBool umgestellt, macht keinen Unterschied. 62 DLL Aufrufe funktionieren, beim 63 gibt's den Crash :( In einem Log-File, das nun die DLL Aufrufe samt Parametern protokolliert, ist kein Fehler erkennbar. Dafür aber dass nach 62 Aufrufen Schluss ist, die hatte ich vorher umständlich mitgezählt :roll: |
AW: Zugriffsverletzung
Aus dem unvollständigen Quelltext wird leider nicht deutlich, ob alle Variablen auch wirklich initialisiert sind. So wie Refr sonstwas enthält, wenn der if-else-Block nicht greift.
Und res wird auch nicht initialisiert, aber ich vermute das soll ein Rückgabewert sein? |
AW: Zugriffsverletzung
Der if / else if block greift immer, das wird wie schon weiter oben beschrieben vor dem Aufrufen der Funktion sichergestellt. 'res' ist der Rückgabewert aus der dll.
Nun werden die dll-Aufrufe mit den übergebenen Werten und den Rückgaben in eine Log-Datei geschrieben. Alle läuft fehlerfrei bis zum 62. Aufruf einer x-beliebigen DLL-Funktion, nach 62. Aufruf wird beim Verlassen der Funktion Udllcall der Fehler wegen Schutzverletzung ausgelöst |
AW: Zugriffsverletzung
Mal anders gedacht: Wenn sich aufgrund fehlender Dokumentation der Grund für die Zugriffsverletzung nicht finden lässt, wie wäre dann ein Workaround, die DLL nach jedem 62. Aufruf neuzuladen?
|
AW: Zugriffsverletzung
Zitat:
Gruß K-H |
AW: Zugriffsverletzung
Ich glaub ich werd welk...
Der Tipp von Benedikt Magnus, das ist DER Tipp. Dachte ich mir. Habe das Programm so umgebaut, dass die DLL für jeden Aufruf dynamisch geladen wird. Die ganze Funktion sieht nun so aus:
Delphi-Quellcode:
Aber leider: nach dem 62zigsten Aufruf der Funktion ist Ende. Genau der selbe Fehler wegen Schutzverletzung. Querprüfung mit dem alten VB6-Code zeigt, dass die an die DLL übergebenen Werte weitestgehend übereinstimmen. Im VB6 gibt es aber keinerlei Probleme.
Function UDllCall(FType, FName: String; TKM, XVar: Double): Double;
Type TFreon1Para = function(ref: PAnsiChar; var dlret: Double): Boolean; stdcall; TFreon2Para = function(ref: PAnsiChar; t: Double; var dlret: Double): Boolean; stdcall; TFreon3Para = function(ref: PAnsiChar; t, p: Double; var dlret: Double): Boolean; stdcall; Var hDLL: THandle; FarProc1: TFreon1Para; FarProc2: TFreon2Para; FarProc3: TFreon3Para; Temp, res: Double; Refr: PAnsiChar; Erg: WordBool; f: TextFile; Adw: String; Begin //GetMem(Refr, 16); Temp := 273.15 + TKM; // Berechnen der Stoffwerte Refr := PAnsiChar('r407c'); 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'); hDLL := LoadLibrary(DLLName); if hDLL = 0 then begin end else Begin if Uppercase(FName) = 'S_TC' then Begin FarProc1 := GetProcAddress(hDLL, 'S_tc'); if Assigned(FarProc1) then erg := FarProc1(refr, res) else res := -999999; //erg := S_tc(Refr, res); End; if Uppercase(FName) = 'S_PC' then Begin FarProc1 := GetProcAddress(hDLL, 'S_pc'); if Assigned(FarProc1) then erg := FarProc1(refr, res) else res := -999999; //erg := S_pc(Refr, res); End; if Uppercase(FName) = 'S_P_D' then Begin FarProc2 := GetProcAddress(hDLL, 'S_p_d'); if Assigned(FarProc2) then erg := FarProc2(refr, Temp, res) else res := -999999; //erg := S_p_d(Refr, Temp, res); End; if Uppercase(FName) = 'S_H_L' then Begin FarProc2 := GetProcAddress(hDLL, 'S_h_l'); if Assigned(FarProc2) then erg := FarProc2(refr, Temp, res) else res := -999999; //erg := S_h_l(Refr, Temp, res); End; if Uppercase(FName) = 'S_H_V' then Begin FarProc3 := GetProcAddress(hDLL, 'S_h_v'); if Assigned(FarProc3) then erg := FarProc3(refr, Temp, XVar, res) else res := -999999; //erg := S_h_v(Refr, Temp, XVar, res); End; if Uppercase(FName) = 'S_SIGMA_L' then Begin FarProc2 := GetProcAddress(hDLL, 'S_sigma_l'); if Assigned(FarProc2) then erg := FarProc2(refr, Temp, res) else res := -999999; //erg := S_sigma_l(Refr, Temp, res); End; if Uppercase(FName) = 'S_VISC_L' then Begin FarProc2 := GetProcAddress(hDLL, 'S_visc_l'); if Assigned(FarProc2) then erg := FarProc2(refr, Temp, res) else res := -999999; //erg := S_visc_l(Refr, Temp, res); End; if Uppercase(FName) = 'S_VISC_V'then Begin FarProc3 := GetProcAddress(hDLL, 'S_visc_v'); if Assigned(FarProc3) then erg := FarProc3(refr, Temp, XVar, res) else res := -999999; //erg := S_visc_v(Refr, Temp, XVar, res); End; if Uppercase(FName) = 'S_V_L' then Begin FarProc2 := GetProcAddress(hDLL, 'S_v_l'); if Assigned(FarProc2) then erg := FarProc2(refr, Temp, res) else res := -999999; //erg := S_v_l(Refr, Temp, res); End; if Uppercase(FName) = 'S_V_V' then Begin FarProc3 := GetProcAddress(hDLL, 'S_v_v'); if Assigned(FarProc3) then erg := FarProc3(refr, Temp, XVar, res) else res := -999999; //erg := S_v_v(Refr, Temp, XVar, res); End; if Uppercase(FName) = 'S_CP_L' then Begin FarProc2 := GetProcAddress(hDLL, 'S_cp_l'); if Assigned(FarProc2) then erg := FarProc2(refr, Temp, res) else res := -999999; //erg := S_cp_l(Refr, Temp, res); End; if Uppercase(FName) = 'S_LAMBDA_L' then Begin FarProc2 := GetProcAddress(hDLL, 'S_lambda_l'); if Assigned(FarProc2) then erg := FarProc2(refr, Temp, res) else res := -999999; //erg := S_lambda_l(Refr, Temp, res); End; if Uppercase(FName) = 'S_LAMBDA_V' then Begin FarProc3 := GetProcAddress(hDLL, 'S_lambda_v'); if Assigned(FarProc3) then erg := FarProc3(refr, Temp, XVar, res) else res := -999999; //erg := S_lambda_v(Refr, Temp, XVar, res); End; if Uppercase(FName) = 'S_VS' then Begin FarProc3 := GetProcAddress(hDLL, 'S_vs'); if Assigned(FarProc3) then erg := FarProc3(refr, Temp, XVar, res) else res := -999999; //erg := S_vs(Refr, Temp, XVar, res); End; if Uppercase(FName) = 'S_T_D' then Begin FarProc2 := GetProcAddress(hDLL, 'S_t_d'); if Assigned(FarProc2) then erg := FarProc2(refr, XVar, res) else res := -999999; //erg := S_t_d(Refr, XVar, res); End; if Uppercase(Fname) = 'S_CV' then Begin FarProc3 := GetProcAddress(hDLL, 'S_cv'); if Assigned(FarProc3) then erg := FarProc3(refr, Temp, XVar, res) else res := -999999; //erg := S_cv(Refr, Temp, XVar, res); End; End; if Erg then Adw := 'erg True' else Adw := 'erg False'; AssignFile(f, Logfile); if FileExists(Logfile) then Append(f) else Rewrite(f); WriteLn(f, FType + ' -> ' + FName + ' -> ' + FloatToStr(TKM) + ' -> ' + FloatToStr(XVar) + ' => ' + FloatToStr(res)+ ' / ' + Adw); CloseFile(f); erg := FreeLibrary(hDLL); Result := res; End; Bereichsprüfung sehe ich soeben in einem anderen Post. Ist das eine Compileroption? |
AW: Zugriffsverletzung
Wenn bei FName was ungültiges übergeben wird, hast du wieder einen Haufen uninitialisierte Variablen ;)
|
AW: Zugriffsverletzung
Zitat:
Zitat:
Gruß K-H |
AW: Zugriffsverletzung
Zitat:
|
AW: Zugriffsverletzung
Zitat:
Erzeuge doch mal die AnsiString Variable mit New(), damit Delphi diese nicht mehr aufräumen kann. Damit entstehen zwar Delphi Memory Leaks, aber evtl. hören die AV auf. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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