Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Delphi mit gsdll32.dll benutzen (Ghostscript) (https://www.delphipraxis.net/142826-delphi-mit-gsdll32-dll-benutzen-ghostscript.html)

FunkyGT 4. Nov 2009 13:07


Delphi mit gsdll32.dll benutzen (Ghostscript)
 
Hallo zusammen,

ich versuche gerade krampfhaft die die gsdll32.dll von ghostscript zu benutzen. und ich weiss nicht was ich falsch mache bzw. wo es denn hakt.

Hat jemand von euch sowas schon mal gemacht?

ich habe es dann nur mit der shell hinbekommen quasi die exe aufgerufen mit diversen parametern.

aber das reicht mir nicht, weil ich nur ein mässige fehlerbehandlung habe.

Ich habe mal das programm bzw. einen teil vom programm abgebildet

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   gs      : Pgs_main_instance;
   code    : integer;
   instance : Pointer;
   argv    : PPChar;
begin
  new(instance);
  setlength(argv,11);
  code:=gsapi_new_instance(@instance,nil);
  if code<>0 then
    begin
      // Fehlerbehandlung
    end;
  try
    argv[0]  := 'ps2pdf';
    argv[1]  := '-dNOPAUSE';
    argv[2]  := '-dBATCH';
    argv[3]  := '-dSAFER';
    argv[4]  := '-sDEVICE=pdfwrite';
    argv[5]  := '-sOutputFile=Test.pdf';
    argv[6]  := '-c';
    argv[7]  := '.setpdfwrite';
    argv[8]  := '-f';
    argv[9]  := '-sPAPERSIZE=a4';
    argv[10] := '123.ps';

    code := gsapi_init_with_args(instance,length(argv),argv);
    if code<0 then
      raise Exception.Create('ERROR: init_args: '+IntToStr(code));
    gsapi_exit(gs);
    gsapi_delete_instance(gs);
  finally
  end;
end;
Falls jemand eine Idee hat, bzw. sowas schon mal realisiert hat, bitte hilfe

Stay tuned

Funky

MarcoWarm 4. Nov 2009 13:12

Re: Delphi mit gsdll32.dll benutzen (Ghostscript)
 
Hi,

Zitat:

Zitat von FunkyGT
und ich weiss nicht was ich falsch mache bzw. wo es denn hakt.

wie zeigt es sich denn, daß du was falsch machst... wie hakt es denn? Gibt's eine Fehlermeldung etc?

Gruß
Marco

FunkyGT 4. Nov 2009 13:39

Re: Delphi mit gsdll32.dll benutzen (Ghostscript)
 
oh man .... stimmt ja, mit fehlermeldung wäre es einfacher ...sorry

ich bekommen den Errorcode -100 wenn ich

Delphi-Quellcode:
code := gsapi_init_with_args(instance,length(argv),argv);
aufrufe bzw. die variable code hat den wert -100

die gsapi_new_instance hingegen funktioniert soweit

Delphi-Quellcode:
code:=gsapi_new_instance(@instance,nil);
und bereitet keinen kummer.

Gruß Funky

Klaus01 4. Nov 2009 14:03

Re: Delphi mit gsdll32.dll benutzen (Ghostscript)
 
Hallo,

vielleicht stimmt ja etwas nicht mit der Übergabe der Instanz?
Hier gibt es einen ähnlichen Thread (allerdings in C)

Grüße
Klaus

MarcoWarm 4. Nov 2009 14:10

Re: Delphi mit gsdll32.dll benutzen (Ghostscript)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Aaaaalso...
ganz genau könnte es dir sicher chaosben erklären. Aber der hat sich heut Urlaub genommen :cheers:

Es könnte an dem Inhalt der übergebenen Args liegen. Aber genaueres kann ich dir leider nicht sagen.

Im Anhang liegt eine Wrapperklasse. Ich weiß nicht genau, ob die von chaosben stammt oder ob die jemand anderes "verbrochen" hat. Ich gehe mal davon aus, daß sie von ihm ist.

es sollte zumindest unter BDS2006 laufen. Ich denke nicht, daß die ganze Sache unicodetauglich ist... wer Spaß dran hat kann das Ganze ja auch weiterentwickeln.


Anzuwenden ist die Klasse so:
Delphi-Quellcode:
procedure TForm1.DoIt;
var
  Wrap : TGSWrapper;
  idx : INteger;
  Inst : TGSInstance;
begin

  ReportMemoryLeaksOnShutdown:=true;

  Wrap:=TGSWrapper.Create('M:\Runtime\GS\gs8.54\bin\gsdll32.dll');

  try
    inst:=Wrap.Instance;
    //Die folgenden Events sollten in TForm1 definiert sein.
    Inst.OnStdOut:=OnStdOut;
    Inst.OnStdErr:=OnStdErr;
    Inst.OnStdIn:=OnStdIn;
    inst.OnNewPage:=OnNewPage;

    cnt:=0;
    printer.BeginDoc;
    //aktuell steht in Memo1
    //-sDEVICE=display
    //-dNOPAUSE
    //-dDisplayFormat=198660
    //-r75
    //l:\project\software\test.pdf
    //zum drucken einer PDF
    Inst.InitWithArgs(Memo1.Lines);
    printer.EndDoc;
  finally
    Wrap.Free;
  end;
end;
Gruß
Marco

Knollnase 23. Dez 2010 14:46

AW: Delphi mit gsdll32.dll benutzen (Ghostscript)
 
Der oben gepostete Code ist in Ordnung, es scheitert wahrscheinlich eher an den Parametern.

Ich empfehle, einen stdout-Handler zu implementieren:
Delphi-Quellcode:
  function GSStdIn(ACaller: Pointer; ABuffer: PAnsiChar; ALen: Integer): Integer; stdcall;
  begin
    Result := StrLen(ABuffer);
  end;

  function GSStdOut(ACaller: Pointer; ABuffer: PAnsiChar; ALen: Integer): Integer; stdcall;
  var
    sBuffer                            : string;
    iChar                              : Integer;
  begin
    for iChar := 0 to ALen - 1 do
      sBuffer := sBuffer + ABuffer[iChar];

    sGSOutput := sGSOutput + sBuffer;
    Result := ALen;
  end;

...

  @gsapi_set_stdio := GetProcAddress(hDllInst, 'gsapi_set_stdio');
  if gsapi_set_stdio(instance, @GSStdIn, @GSStdOut, @GSStdOut) <> 0 then
    raise Exception.Create('Could not set stdio functions');
In der Variable sGSOutput werden so alle Ausgaben (z.B. Fehlermeldungen) von GhostScript gespeichert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 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