Discussion:
XE5: ShellExecute und warten bis fertig
(zu alt für eine Antwort)
Heiko Rompel
2014-05-07 17:14:10 UTC
Permalink
So da bin ich wieder :-)

Das senden von Dateien mittels 'ShellExecute' an den Standard-Drucker
funktioniert, aber ...

Ich sende die Dateien 1,2,3,4 und Windows druckt 1,3,2,4 oder 2,1,4,3 -
so wie es ihm beliebt.

Jetzt habe ich schon geschaut ob "ShellExecute" einen Rückgabewert
liefert da meldet das der Auftrag fertig ist, aber so etwas gibt es nicht.

Wie kann ich feststellen ob der Druckauftrag des Standard-Druckers (Egal
welches Gerät und welcher Hersteller) fertig ist?

Gruß Heiko
Jakob Achterndiek
2014-05-07 17:28:09 UTC
Permalink
Post by Heiko Rompel
So da bin ich wieder :-)
Das senden von Dateien mittels 'ShellExecute' an den Standard-Drucker
funktioniert, aber ...
Ich sende die Dateien 1,2,3,4 und Windows druckt 1,3,2,4 oder 2,1,4,3 -
so wie es ihm beliebt.
Jetzt habe ich schon geschaut ob "ShellExecute" einen Rückgabewert
liefert da meldet das der Auftrag fertig ist, aber so etwas gibt es nicht.
Wie kann ich feststellen ob der Druckauftrag des Standard-Druckers (Egal
welches Gerät und welcher Hersteller) fertig ist?
In der Hilfe zu ShellExecute findest du u.a.: "If the function fails,
the return value is an error value that is less than or equal to 32".
Damit müßte sich doch arbeiten lassen.

Eine Erfahrung bei anderer Gelegenheit war, daß der Windows-Explorer
sich intern nicht an die sortierte Reihenfolge der Dateien hält,
sondern sie nach irgend einem anderen Prinzip ausgibt. Ich hatte
bisher noch keinen Anlaß, das irgendwie zu modifizieren, kann dazu
also nichts weiter sagen.

j/\a
--
Heiko Rompel
2014-05-07 17:33:43 UTC
Permalink
Post by Jakob Achterndiek
In der Hilfe zu ShellExecute findest du u.a.: "If the function fails,
the return value is an error value that is less than or equal to 32".
Damit müßte sich doch arbeiten lassen.
Nee, damit weiß ich das der Auftrag abgeschickt wurde, aber wenn z.B.
Word das entgegengenommen hat, dann ist alles i.O. und der Wert ist
größer 32.

Wenn man feststellen könnt ob noch etwas im Spooler ist, dann könnte man
vielleicht darauf warten, aber das scheint nicht so einfach zu sein.

Gruß Heiko
Peter
2014-05-07 18:43:29 UTC
Permalink
Dieser beitrag ist möglicherweise unangemessen. Klicken sie auf, um es anzuzeigen.
Björn Schreiber
2014-05-08 06:39:16 UTC
Permalink
Post by Heiko Rompel
Wie kann ich feststellen ob der Druckauftrag des Standard-Druckers (Egal
welches Gerät und welcher Hersteller) fertig ist?
Schau dir mal von SHELLEXECUTEINFO die Beschreibung für das Feld
hProcess an, welches du ggf. in Verbindung mit WaitForSingeObject in
etwa wie folgt nutzen kannst:

--- Schnipp On ---

var
Info: tShellExecuteInfo;

...
Info.fMask := SEE_MASK_NOCLOSEPROCESS;
Result := ShellExecuteExA(@Info);

if Result then
repeat
ExitCode := WaitForSingleObject(Info.hProcess, 250);
Application.ProcessMessages;
until ExitCode <> WAIT_TIMEOUT;
...

--- Schnipp Off ---

Das funktioniert in den meisten Fällen zumindest in der Verbindung
mit dem Verb 'open', bzgl. dem Verb 'print' fehlen mir leider die
Erfahrungen.

Grüße,
Björn
Hans-Peter Diettrich
2014-05-08 05:25:52 UTC
Permalink
Post by Heiko Rompel
So da bin ich wieder :-)
Das senden von Dateien mittels 'ShellExecute' an den Standard-Drucker
funktioniert, aber ...
Ich sende die Dateien 1,2,3,4 und Windows druckt 1,3,2,4 oder 2,1,4,3 -
so wie es ihm beliebt.
Das könnte daran liegen, daß die Spool-Dateien gleichzeitig erstellt
werden (multi-tasking), und dann die Datei zuerst gedruckt wird, die
zuerst fertiggestellt wurde. D.h. kurze Dokumente mit wenig
eingebetteten Grafiken etc. werden eher gedruckt als lange.
Post by Heiko Rompel
Jetzt habe ich schon geschaut ob "ShellExecute" einen Rückgabewert
liefert da meldet das der Auftrag fertig ist, aber so etwas gibt es nicht.
Wie kann ich feststellen ob der Druckauftrag des Standard-Druckers (Egal
welches Gerät und welcher Hersteller) fertig ist?
Siehe andere Antworten...

Mir fallen zwei Lösungsansätze ein (ungetestet):

1) ShellExecute liefert ein HINSTANCE (>32), d.h. das Handle eines
Prozesses. Darüber könnte sich feststellen lassen, wann dieser Prozess
beendet wurde. Ich würde davon ausgehen, daß der Prozess beim Drucken
dann beendet wird, wenn die Spool-Datei in die Warteschlange des
Druckers gestellt wurde, und daß man dann die nächste Datei drucken
lassen kann.

Siehe dazu auch SellExecuteEx und SEE_MASK_NOCLOSEPROCESS, ...NOASYNC,
...WAITFORINPUTIDLE

2) Ein Super-Dokument erstellen (Word...), das alle zu druckenden
Dokumente in der gewünschten Reihenfolge enthält (eingebettet), und das
dann drucken lassen.

3) Den Drucker-Spooler (vorübergehend) abschalten. Kai Neahnung ob das
möglich ist...

DoDi
Heiko Rompel
2014-05-08 20:06:33 UTC
Permalink
Post by Hans-Peter Diettrich
1) ShellExecute liefert ein HINSTANCE (>32), d.h. das Handle eines
Prozesses. Darüber könnte sich feststellen lassen, wann dieser Prozess
beendet wurde. Ich würde davon ausgehen, daß der Prozess beim Drucken
dann beendet wird, wenn die Spool-Datei in die Warteschlange des
Druckers gestellt wurde, und daß man dann die nächste Datei drucken
lassen kann.
habe ich schon probiert, aber der Wert ist ist über 32 wenn die Datei an
den Spooler übergeben wurde.
Und aus dem Spooler druckt Windows so wie es Lust hat.
Post by Hans-Peter Diettrich
2) Ein Super-Dokument erstellen (Word...), das alle zu druckenden
Dokumente in der gewünschten Reihenfolge enthält (eingebettet), und das
dann drucken lassen.
Darauf läuft es im Moment hinaus...
Post by Hans-Peter Diettrich
3) Den Drucker-Spooler (vorübergehend) abschalten. Kai Neahnung ob das
möglich ist...
Geht, aber dann kommt es immer noch darauf an welcher Druckauftrag als
ersten den Drucker erreicht

Gruß Heiko
Hans-Peter Diettrich
2014-05-08 21:05:29 UTC
Permalink
Post by Heiko Rompel
Post by Hans-Peter Diettrich
1) ShellExecute liefert ein HINSTANCE (>32), d.h. das Handle eines
Prozesses. Darüber könnte sich feststellen lassen, wann dieser Prozess
beendet wurde. Ich würde davon ausgehen, daß der Prozess beim Drucken
dann beendet wird, wenn die Spool-Datei in die Warteschlange des
Druckers gestellt wurde, und daß man dann die nächste Datei drucken
lassen kann.
habe ich schon probiert, aber der Wert ist ist über 32 wenn die Datei an
den Spooler übergeben wurde.
Wie sollte sich dieser Wert auch selbständig ändern?

Du mußt abfragen, ob zu diesem Handle noch ein Prozess gehört. Bei
Window-Handles (HWND) geht das über IsWindow(handle), für Prozesse
sollte es was ähnliches geben.

DoDi
Heiko Rompel
2014-05-09 15:42:31 UTC
Permalink
Ich habe jetzt das hier im Netz gefunden:

=================
// Quelle:
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_10266896.html


from borland support:
2000-01-28 at 06:17:49

Article #16727: Detecting how many jobs are In the print spooler

Question and Answer Database

FAQ1727D.txt Detecting how many jobs are In the print spooler
Category :WIndows API
Platform :All
Product :All 32 bit

Question:
Is there any way to detect how many jobs are In the Windows print
spooler at any given time?

Answer:
The Windows print spooler regularly broadcasts a system wide
WM_SPOOLERSTATUS message each time a job is added or deleted from the
spooler que. The following example demonstrates trapping for this
message.

Example:

TYPE
TForm1 = class(TForm)
Label1: TLabel;
private
{Private declarations }
procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
message WM_SPOOLERSTATUS;
public
{Public declarations }
end;

var
Form1: TForm1;

Implementation
{$R *.DFM}

procedure TForm1.WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
begin
Label1.Caption := IntToStr(msg.jobsLeft) +'jobs currenly In spooler';
msg.Result := 0;
end;

=================

Aber, egal ob ich das Standalone laufen lasse oder mit in meine
Anwendung packe, "TForm1.WM_SpoolerStatus" wird nicht aufgerufen.

Entweder sitzt der Fehler vor dem Schirm oder da wurde in Windows was
geändert.

Hier unter Windows 8.1 32Bit und 64Bit läuft es nicht.

Gruß Heiko
Peter
2014-05-09 17:38:11 UTC
Permalink
Post by Heiko Rompel
=================
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_10266896.html
Post by Heiko Rompel
2000-01-28 at 06:17:49
Article #16727: Detecting how many jobs are In the print spooler
Funktioniert nicht mehr. WM_SPOOLERSTATUS war Win9x, ist auf
NT-Platformen nicht verfügbar.
--
Peter Below
Heiko Rompel
2014-05-09 19:44:51 UTC
Permalink
Post by Peter
Post by Heiko Rompel
Article #16727: Detecting how many jobs are In the print spooler
Funktioniert nicht mehr. WM_SPOOLERSTATUS war Win9x, ist auf
NT-Platformen nicht verfügbar.
Gibt es eine Alternative?

Gruß Heiko
Peter
2014-05-10 08:05:24 UTC
Permalink
Post by Heiko Rompel
Post by Peter
Post by Heiko Rompel
Article #16727: Detecting how many jobs are In the print spooler
Funktioniert nicht mehr. WM_SPOOLERSTATUS war Win9x, ist auf
NT-Platformen nicht verfügbar.
Gibt es eine Alternative?
Gruß Heiko
FindFirstPrinterChangeNotification und sein FindNext-Partner.
Vielleicht kannst Du hiermit was anfangen:
http://cc.embarcadero.com/item/20307
--
Peter Below
Heiko Rompel
2014-05-10 09:25:50 UTC
Permalink
Post by Peter
http://cc.embarcadero.com/item/20307
Unter XE5 nicht nutzbar. 40 Fehler durch nicht mehr vorhandene
Funktionen, nicht deklarierte Variablen usw.

Gruß Heiko

Loading...