Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

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

GhostScript: Zugriffsverletzung

  Alt 6. Jul 2020, 08:50
Hallöle...

Ich habe eine Unit erstellt, welche mir ein erzeugtes PDF nochmal etwas verkleinert. (wegen Datenmenge bei Übertragung). Soweit so weit so gut. Die Klasse funktioniert seit 1,5 Jahren...oder so. Die Funktion die ich benötige, wird bei jedem PDF Druck verwendet.

In einem Programmteil fliegt mir neuerdings die function mit einer Zugriffsverletzung um die Ohren.

Gegeben:
* eine EXE vom Server
* eine gsdll32.dll vom Server

Problem:
Auf den meisten Arbeitsstationen funktioniert das problemlos. Letzte Woche hatte ich 2 Arbeitsstationen wo es bei einer funktionierte, bei der Anderen Zugriffsverletzung. Am nächsten Tag funktionierte auch die andere nicht...gleiche EXE, gleiche DLL

Code:
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;
  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');
      FGsApiExit := GetProcAddress(FDLLHandle, 'gsapi_exit');
      FGsApiDeleteInstance := GetProcAddress(FDLLHandle, 'gsapi_delete_instance');
    end
    else
    begin
      FOnError(Self, '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)]));
    Result := False;
  end;
end;

function TGhostscript.PDFShrink(FileName: string): Boolean;
var
  TargetFileName: string;
begin
  if FDLLHandle = 0 then
  begin
    LoadDLL(FDLLPath);
  end;
  try
    TargetFileName := IncludeTrailingPathDelimiter(ExtractFilePath(FileName)) + conFileNameTempPDF;
    SetLength(FParameters, 7);
    FParameters[0] := '';
    FParameters[1] := '-dNOPAUSE';
    FParameters[2] := '-dBATCH';
    FParameters[3] := '-dPDFSETTINGS=/ebook';
    FParameters[4] := '-sDEVICE=pdfwrite';
    FParameters[5] := PAnsiChar(AnsiString('-sOutputFile=' + TargetFileName));
    FParameters[6] := PAnsiChar(AnsiString(FileName));

    Result := (FGsApiInitWithArgs(FGsInstance, Length(FParameters), FParameters) = 0); //(Zeile 118)

  finally
    FGsApiExit(FGsInstance); //(Zeile 121)
  end;

  if Result then
  begin
    if not TToolsIO.IsFileInUse(FileName) then
    begin
      TFile.Delete(FileName);
      RenameFile(TargetFileName, FileName);
    end;
  end
end;
Frage:
1. Wo sollte ich ansetzen?
2. Windows Update verantwortlich?
3. neueste DLL benutzen? (verwendete 1 Jahr alt)

Danke...

PS: In der Entwicklung habe ich den Fehler noch nie gesehen...
Miniaturansicht angehängter Grafiken
error.png   callstack.png  

Geändert von haentschman ( 6. Jul 2020 um 09:21 Uhr)
  Mit Zitat antworten Zitat