AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Beliebiges Dokument über Fremdanwendung ausdrucken
Thema durchsuchen
Ansicht
Themen-Optionen

Beliebiges Dokument über Fremdanwendung ausdrucken

Ein Thema von Jelly · begonnen am 18. Nov 2005 · letzter Beitrag vom 18. Nov 2005
Antwort Antwort
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 13:10
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.drvname '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?
  Mit Zitat antworten Zitat
Benutzerbild von neuronet
neuronet

Registriert seit: 16. Aug 2005
Ort: Berlin
104 Beiträge
 
Delphi 2010 Architect
 
#2

Re: Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 13:26
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???
Andreas
--- Der Wert der Leistung liegt im Geleisteten --- Albert Einstein

Mein erstes Baby: Apple I - Der Rechner ist genauso alt wie ich... Und steht noch immer im Keller...
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 13:31
Zitat von neuronet:
Wie hast Du denn ShellExecuteAndWait aufgerufen???
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.
  Mit Zitat antworten Zitat
Benutzerbild von neuronet
neuronet

Registriert seit: 16. Aug 2005
Ort: Berlin
104 Beiträge
 
Delphi 2010 Architect
 
#4

Re: Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 13:43
Zum automatischen Schließen von Acrobat müsste das Flag "/t" mit übergeben werden.
Damit beendet Acrobat sich automatisch nach dem Drucken.
Andreas
--- Der Wert der Leistung liegt im Geleisteten --- Albert Einstein

Mein erstes Baby: Apple I - Der Rechner ist genauso alt wie ich... Und steht noch immer im Keller...
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 13:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von neuronet
neuronet

Registriert seit: 16. Aug 2005
Ort: Berlin
104 Beiträge
 
Delphi 2010 Architect
 
#6

Re: Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 14:00
Hast Du das Problem, dass die Anwendung offen bleibt nur bei Acrobat, oder auch bei anderen???
Andreas
--- Der Wert der Leistung liegt im Geleisteten --- Albert Einstein

Mein erstes Baby: Apple I - Der Rechner ist genauso alt wie ich... Und steht noch immer im Keller...
  Mit Zitat antworten Zitat
Benutzerbild von neuronet
neuronet

Registriert seit: 16. Aug 2005
Ort: Berlin
104 Beiträge
 
Delphi 2010 Architect
 
#7

Re: Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 14:03
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...
Andreas
--- Der Wert der Leistung liegt im Geleisteten --- Albert Einstein

Mein erstes Baby: Apple I - Der Rechner ist genauso alt wie ich... Und steht noch immer im Keller...
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 14:07
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.
  Mit Zitat antworten Zitat
Benutzerbild von neuronet
neuronet

Registriert seit: 16. Aug 2005
Ort: Berlin
104 Beiträge
 
Delphi 2010 Architect
 
#9

Re: Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 14:30
Schau mal hier:

Acrobat Switches

und hier:

Batch Printing

Vielleicht hilft Dir das weiter...
Andreas
--- Der Wert der Leistung liegt im Geleisteten --- Albert Einstein

Mein erstes Baby: Apple I - Der Rechner ist genauso alt wie ich... Und steht noch immer im Keller...
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 15:00
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.
  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 16:23 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