![]() |
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:
Falls jemand eine Idee hat, bzw. sowas schon mal realisiert hat, bitte hilfe
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; Stay tuned Funky |
Re: Delphi mit gsdll32.dll benutzen (Ghostscript)
Hi,
Zitat:
Gruß Marco |
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:
aufrufe bzw. die variable code hat den wert -100
code := gsapi_init_with_args(instance,length(argv),argv);
die gsapi_new_instance hingegen funktioniert soweit
Delphi-Quellcode:
und bereitet keinen kummer.
code:=gsapi_new_instance(@instance,nil);
Gruß Funky |
Re: Delphi mit gsdll32.dll benutzen (Ghostscript)
Hallo,
vielleicht stimmt ja etwas nicht mit der Übergabe der Instanz? Hier gibt es einen ähnlichen ![]() Grüße Klaus |
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:
Gruß
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; Marco |
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:
In der Variable sGSOutput werden so alle Ausgaben (z.B. Fehlermeldungen) von GhostScript gespeichert.
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'); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 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 by Thomas Breitkreuz