AGB  ·  Datenschutz  ·  Impressum  







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

GhostScript: Zugriffsverletzung

Ein Thema von haentschman · begonnen am 6. Jul 2020 · letzter Beitrag vom 6. Jul 2020
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.562 Beiträge
 
Delphi 7 Professional
 
#1

AW: GhostScript: Zugriffsverletzung

  Alt 6. Jul 2020, 12:40
Davor   FDLLHandle := LoadLibrary(PChar(CurrentDLLPath)); würde ich mal grundsätzlich einIf FileExists(CurrentDLLPath) then begin einbauen. Gibt's die DLL nicht, wird eine Fehlermeldung ausgegeben oder geloggt oder ...

Eventuell dauert das Laden der DLL oder der Zugriff auf den Server ... zu lange oder fällt sporadisch aus oder Lesefehler, so dass die DLL in "kaputtem" Zustand geladen wird ...
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.444 Beiträge
 
Delphi 12 Athens
 
#2

AW: GhostScript: Zugriffsverletzung

  Alt 6. Jul 2020, 12:55

Zitat:
Japp, es genügt ja, wenn Du Fehler/unerwartete Rückgaben loggst.
...jetzt logge ich alle Rückgaben. Wenn LoadDLL fehlschlägt wird nicht mehr "verkleinert"
Zitat:
würde ich mal grundsätzlich einIf FileExists(CurrentDLLPath) then
...erledigt.
Delphi-Quellcode:
function TGhostscript.LoadDLL(PathDLL: string): Boolean;
var
  CurrentDLLPath: string;
begin
  if PathDLL = 'then
  begin
    CurrentDLLPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + conDLLName;
  end
  else
  begin
    CurrentDLLPath := PathDLL;
  end;

  if TFile.Exists(CurrentDLLPath) then
  begin
    FDLLHandle := LoadLibrary(PChar(CurrentDLLPath));
  end;

  if FDLLHandle > 0 then
  begin
    FGsInit := GetProcAddress(FDLLHandle, 'gsapi_new_instance');
    Result := (FGsInit(@FGsInstance, nil) = 0);
    if Result then
    begin
      FGsApiInitWithArgs := GetProcAddress(FDLLHandle, 'gsapi_init_with_args');
      if not Assigned(FGsApiInitWithArgs) then
      begin
        FOnError(Self, 'GsApiInitWithArgs konnte nicht ermittelt werden.');
        FLog.Log('GsApiInitWithArgs konnte nicht ermittelt werden');
        Result := False;
      end;
      FGsApiExit := GetProcAddress(FDLLHandle, 'gsapi_exit');
      if not Assigned(FGsApiExit) then
      begin
        FOnError(Self, 'GsApiExit konnte nicht ermittelt werden.');
        FLog.Log('GsApiExit konnte nicht ermittelt werden');
        Result := False;
      end;
      FGsApiDeleteInstance := GetProcAddress(FDLLHandle, 'gsapi_delete_instance');
      if not Assigned(FGsApiDeleteInstance) then
      begin
        FOnError(Self, 'GsApiDeleteInstance konnte nicht ermittelt werden.');
        FLog.Log('GsApiDeleteInstance konnte nicht ermittelt werden');
        Result := False;
      end;
    end
    else
    begin
      FOnError(Self, 'Die Ghostscript Instanz konnte nicht erzeugt werden.');
      FLog.Log('Die Ghostscript Instanz konnte nicht erzeugt werden.');
      Result := False;
    end;
  end
  else
  begin
    FOnError(Self, Format('Die Ghostscript DLL %s wurde nicht geladen.', [QuotedStr(CurrentDLLPath)]));
    FLog.Log('Die Ghostscript DLL wurde nicht geladen');
    Result := False;
  end;
end;
Danke erstmal...

Geändert von haentschman ( 6. Jul 2020 um 13:05 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.562 Beiträge
 
Delphi 7 Professional
 
#3

AW: GhostScript: Zugriffsverletzung

  Alt 6. Jul 2020, 13:11
mmmmmhhhh.... weiß nicht so recht:
Delphi-Quellcode:
if TFile.Exists(CurrentDLLPath) then
begin
  FDLLHandle := LoadLibrary(PChar(CurrentDLLPath));
end;

if FDLLHandle > 0 then
Wat iss denne, wenn FDLLHandle vor dem if TFile.Exists(CurrentDLLPath) then 'nen Wert > 0 hat?

Von mir aus sowas:
Delphi-Quellcode:
if not TFile.Exists(CurrentDLLPath) then begin
  // Fehlerloggen
  Result := false;
  exit;
end;
aber keinerfalls bei fehlender DLL noch irgendwas in der Routine machen außer Result := false;
Eventuell noch hinter das erste Begin am Anfang der Routine ein Result := False; als grundsätzlich erstmal festgelegter Rückgabewert der Funktion, der nur bei Erfolg auf true geändert wird.
Delphi-Quellcode:
function TGhostscript.LoadDLL(PathDLL: string): Boolean;
var
  CurrentDLLPath: string;
begin
  Result := false;
  if PathDLL = 'then
  begin
    CurrentDLLPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + conDLLName;
  end
  else
  begin
    CurrentDLLPath := PathDLL;
  end;

  if TFile.Exists(CurrentDLLPath) then
  begin
    FDLLHandle := LoadLibrary(PChar(CurrentDLLPath));
    if FDLLHandle > 0 then
    begin
      FGsInit := GetProcAddress(FDLLHandle, 'gsapi_new_instance');
      Result := (FGsInit(@FGsInstance, nil) = 0);
      if Result then
      begin
        FGsApiInitWithArgs := GetProcAddress(FDLLHandle, 'gsapi_init_with_args');
        if not Assigned(FGsApiInitWithArgs) then
        begin
          FOnError(Self, 'GsApiInitWithArgs konnte nicht ermittelt werden.');
          FLog.Log('GsApiInitWithArgs konnte nicht ermittelt werden.');
          Result := False;
        end;
        FGsApiExit := GetProcAddress(FDLLHandle, 'gsapi_exit');
        if not Assigned(FGsApiExit) then
        begin
          FOnError(Self, 'GsApiExit konnte nicht ermittelt werden.');
          FLog.Log('GsApiExit konnte nicht ermittelt werden.');
          Result := False;
        end;
        FGsApiDeleteInstance := GetProcAddress(FDLLHandle, 'gsapi_delete_instance');
        if not Assigned(FGsApiDeleteInstance) then
        begin
          FOnError(Self, 'GsApiDeleteInstance konnte nicht ermittelt werden.');
          FLog.Log('GsApiDeleteInstance konnte nicht ermittelt werden.');
          Result := False;
        end;
      end
      else
      begin
        FOnError(Self, 'Die Ghostscript Instanz konnte nicht erzeugt werden.');
        FLog.Log('Die Ghostscript Instanz konnte nicht erzeugt werden.');
        Result := False;
      end;
    end
    else
    begin
      FOnError(Self, Format('Die Ghostscript DLL %s wurde nicht geladen.', [QuotedStr(CurrentDLLPath)]));
      FLog.Log('Die Ghostscript DLL wurde nicht geladen.');
      Result := False;
    end;
  end
  else
  begin
    FOnError(Self, Format('Die Ghostscript DLL %s wurde nicht gefunden.', [QuotedStr(CurrentDLLPath)]));
    FLog.Log('Die Ghostscript DLL wurde nicht gefunden.');
    Result := False;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.662 Beiträge
 
Delphi 12 Athens
 
#4

AW: GhostScript: Zugriffsverletzung

  Alt 6. Jul 2020, 13:36
Delphi-Quellcode:
FGsInit := GetProcAddress(FDLLHandle, 'gsapi_new_instance');
// Prüfung vergessen ;-)
if not Assigned(FGsInit then
  raise SomeException.Create('gsapi_new_instance nicht implementiert');
Result := (FGsInit(@FGsInstance, nil) = 0);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: GhostScript: Zugriffsverletzung

  Alt 6. Jul 2020, 13:45
Hallo,
ich würde auch mal den Virenscanner prüfen.

Ausserdem würde ich mit MadExcept mal eine Exe bauen,
die dir genau sagt, in welcher Zeile die Zugriffsverletzung auftritt.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.444 Beiträge
 
Delphi 12 Athens
 
#6

AW: GhostScript: Zugriffsverletzung

  Alt 6. Jul 2020, 16:41
Zeile 118 siehe 1 Post...
Zitat:
// Prüfung vergessen
...nee oder? Das kommt, wenn man auf mehreren Baustellen unterwegs ist.
Zitat:
Wat iss denne, wenn FDLLHandle vor dem if TFile.Exists(CurrentDLLPath) then 'nen Wert > 0 hat?
...ja nix. Dann ist diese, und nur diese Variable, mit dem Handle der DLL gefüllt. Vor dem Druck wird das Print Objekt, incl. dem GhostScript Objekt erzeugt. Nach dem Ausführen des Druckes (1-3000 Rechnungen) wird das Print Objekt, incl. dem GhostScript Objekt freigeben, und damit das Handle der DLL
Delphi-Quellcode:
FreeLibrary(FDLLHandle);
_
Test:
Delphi-Quellcode:
Result := (FGsApiInitWithArgs(FGsInstance, Length(FParameters), FParameters) = 0);
_
DLL 9.27 = True (Macht eine temporäre Datei und benennt diese dann um)
DLL 9.52 = False (nix)
...selbe Parameter, Namen, Pfade.

Geändert von haentschman ( 6. Jul 2020 um 18:13 Uhr)
  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 13:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz