Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Beliebiges Dokument über Fremdanwendung ausdrucken (https://www.delphipraxis.net/57284-beliebiges-dokument-ueber-fremdanwendung-ausdrucken.html)

Jelly 18. Nov 2005 13:10


Beliebiges Dokument über Fremdanwendung ausdrucken
 
Ich nutze folgende, zum Teil hier aus dem Forum zusammengezimmerte, Klass, um den Standarddrucker auf einem Rechner auszulesen und auch zu setzen, beides über die Eigenschaft DefaultPrinterName.
Delphi-Quellcode:
unit PrinterSettings;

interface
uses windows, sysutils, classes, dialogs, messages ;

function GetDefaultPrinterA(prnName : PAnsiChar; var bufSize : DWORD ) : BOOL; stdcall;
       external 'winspool.drv' name 'GetDefaultPrinterA';

type
 TPrinterSettings = class
  private
    function getDefaultPrinterName: string;
    procedure SetDefaultPrinterName(const Value: string);
 public
       property DefaultPrinterName : string read GetDefaultPrinterName write SetDefaultPrinterName ;
 end ;

var
 PS : TPrinterSettings ;

implementation
uses printers ;

function TPrinterSettings.getDefaultPrinterName:string;
var
  lprnName: PAnsiChar;
  lBufSize: DWord;
begin
  GetMem(lprnName, 1000);
  try
     GetDefaultPrinterA(lprnName, lBufSize);
     Result := lprnName;
  finally
     FreeMem(lprnName);
  end;
end;

procedure TPrinterSettings.SetDefaultPrinterName(const Value: string);
var
  Device: array[0..255] of char;
  Driver: array[0..255] of char;
  Port: array[0..255] of char;
  hDeviceMode: THandle;
begin
  if Printer.Printers.IndexOf (Value) >= 0 then begin
      Printer.PrinterIndex := Printer.Printers.IndexOf (Value) ;
      Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
      StrCat( Device, ',');
      StrCat( Device, Driver );
      StrCat( Device, ',');
      StrCat( Device, Port );
      WriteProfileString( 'windows', 'device', Device );
      StrCopy( Device, 'windows' );
      SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0, longint( @Device ));
      sleep (2000) ;
  end else begin

  end ;
end;

initialization
   PS := TPrinterSettings.create ;
finalization
   PS.free ;
end.
Sinn der ganzen Sache ist es, beliebige Dokumente (PDF,DOC...) an einen von mir ausgewählten Drucker zu drucken, da die meisten Programme mittels ShellExecute nur an den Standarddrucker ausgeben.
Delphi-Quellcode:
AlterDrucker := PS.DefaultPrinterName ;
PS.DefaultPrinterName := 'OKI' ;
ShellExecute (H,'print',PChar(DokumentName),nil,PChar(extractFilePath(DokumettName)),SW_SHOWMINIMIZED) ;
PS.DefaultPrinterName := AlterDrucker ;
Aber irgendwie kriegt die zu druckende Anwendung (z.B. der Acrobat Reader) diese Druckerwechsel aber nicht mit, da mein Delphi Programm weiter abläuft bevor Acrobat überhaupt das Dokument verarbeitet hat. In der Zwischenzeit habe ich dann wieder den alten Drucker zurückgestellt.

Ich hatte dann die Idee über ShellExecuteAndWaitA
aber der Versuch schlägt ebenfalls fehl...

So, was kann ich noch tun, um nach erfolgreichem Druck den Standarddrucker wieder herzustellen?

neuronet 18. Nov 2005 13:26

Re: Beliebiges Dokument über Fremdanwendung ausdrucken
 
ShellExecuteAndWait ist schon der richtige Ansatz.

Wenn Du den Standarddrucker änderst, dann print aufrufst und nicht abwartest, bis print abgeschlossen ist, dann ist die Wahrscheinlichkeit sehr hoch, dass das zurücksetzen des Standarddruckers in deiner Anwendung noch vor dem Druck des Dokuments erfolgt, und du somit nix erreicht hast.

Wie hast Du denn ShellExecuteAndWait aufgerufen???

Jelly 18. Nov 2005 13:31

Re: Beliebiges Dokument über Fremdanwendung ausdrucken
 
Zitat:

Zitat von neuronet
Wie hast Du denn ShellExecuteAndWait aufgerufen???

Delphi-Quellcode:
ShellExecuteAndWaitA (H,'print',PChar(DokumentName),nil,PChar(extractFilePath(DokumentName)),SW_SHOWMAXIMIZED,true) ;
Daran ist auch an sich nichts falsch. Bietet sich aber da noch ein anderes Problem, weil bei dem Print Befehl z.B. der Acrobat sich nach Beenden nicht automatisch schliesst. Und solange der Acrobat läuft, ist meine Anwendung blockiert.

PS: Das mit dem Drucker ändern klappt jetzt. Da der Wechsel über ein Sendmessage ans OS abläuft, war die Botschaft wohl noch nicht abgearbeitet bevor ich shellexecute aufrufe. Ein kleine Sleep(300) hat da geholfen.

neuronet 18. Nov 2005 13:43

Re: Beliebiges Dokument über Fremdanwendung ausdrucken
 
Zum automatischen Schließen von Acrobat müsste das Flag "/t" mit übergeben werden.
Damit beendet Acrobat sich automatisch nach dem Drucken.

Jelly 18. Nov 2005 13:57

Re: Beliebiges Dokument über Fremdanwendung ausdrucken
 
Das Ganze soll aber nicht nur mit Acrobat laufen, sondern mit jedem im System registrierten Filetyp.

ich hab mir jetzt mal so beholfen, dass ich den Standarddrucker umbiege, dann über ein einfaches ShellExecute ein beliebiges Dokument zum Drucken öffne. Was halt nun nicht geht, ist den Standarddrucker anschliessend wieder zurückzusetzen.

neuronet 18. Nov 2005 14:00

Re: Beliebiges Dokument über Fremdanwendung ausdrucken
 
Hast Du das Problem, dass die Anwendung offen bleibt nur bei Acrobat, oder auch bei anderen???

neuronet 18. Nov 2005 14:03

Re: Beliebiges Dokument über Fremdanwendung ausdrucken
 
Wenn das Problem nur mit Acrobat besteht, dann müsstest du vor dem ShellExec folgenden Registry-Eintrag ändern:

alt:

\HKEY_CLASSES_ROOT\.pdf\OpenWithList\AcroRd32.exe

neu:

\HKEY_CLASSES_ROOT\.pdf\OpenWithList\AcroRd32.exe /t

Und nach dem Drucken wieder zurücksetzen...

Jelly 18. Nov 2005 14:07

Re: Beliebiges Dokument über Fremdanwendung ausdrucken
 
Bislang nur bei Acrobat... Word läuft sauber.
Das hiesse für mich, ich könnte mit dem /t Schalter arbeiten... Nur klappt der nicht. Kann man diese ganzen Switches irgendwo lesen. Hab bislang nichts gefunden.

neuronet 18. Nov 2005 14:30

Re: Beliebiges Dokument über Fremdanwendung ausdrucken
 
Schau mal hier:

Acrobat Switches

und hier:

Batch Printing

Vielleicht hilft Dir das weiter...

Jelly 18. Nov 2005 15:00

Re: Beliebiges Dokument über Fremdanwendung ausdrucken
 
Ich bin mittlerweilen zum Entschluss gekommen, dass ich wohl gar nicht über Acrobat drucken werden, sondern über gsprint. Dazu hätt ich auch noch ne Frage, aber dafür mach ich ein neues Thema auf... Danke für deine Hinweise.


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