Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Druckerstatus (https://www.delphipraxis.net/90089-druckerstatus.html)

Christoph Frank 19. Apr 2007 10:24

Re: Druckerstatus
 
Hallo zusammen,

wußte garnicht, daß ich mit dem Drucker so'ne Lawine lostrete. Anscheinend ist das Problem Drucker aber garnicht so trivial.
Hallo bisetter, habe Deine Routine mal bei mir eingebaut. Eine kleine Änderung mußte ich vornehmen:

if WinSpool.OpenPrinter(@Device, hPrinter, nil) then
geändert in
if WinSpool.OpenPrinter(Device, hPrinter, nil) then
sonst gibt es einen Fehler : Incompatible Typen: 'Array' und 'Char'.

Bei der entscheidenden Abfrage erhalte ich immer folgendes:
if hDevice <> INVALID_HANDLE_VALUE then

hDevice = '4294967295'
INVALID_HANDLE_VALUE = '4294967295'

also ist der Drucker immer offline. Was kann ich denn jetzt noch machen?

bitsetter 19. Apr 2007 23:24

Re: Druckerstatus
 
Hallo,

den Code habe ich jetzt mit dem selben Drucker unter WinXP getestet, dort funktionierte er jedoch auch nicht.
Das man mit CreateFile unter Win98 jedoch nicht unter WinXP auf den Drucker zugreifen kann, haben wohl auch schon andere Leute festgestellt.
Wenn der Code bei dir unter Win98 nicht geht, dann wird es wohl nicht mit allen Druckern funktionieren. :(

Olli 20. Apr 2007 00:52

Re: Druckerstatus
 
Interessanter als der Wert des Handles waere was GetLastError() zurueckgibt. Ich vermute mal, dass einer der Parameter CreateFile() nicht schmeckt, denn prinzipiell kann man Symlinks auf Geraete unter XP (und NT4/2000/2003 ...) sehr wohl per CreateFile() oeffnen. Uebrigens eine nette Analogie zu Linux' "/dev"-Verzeichnis ;)

Im uebrigen braucht man einen Printermonitor (ja, das heisst so) um einen Druckjob zu unterbinden (falls das wirklich das Ziel ist) - es sei denn das Drucken selber (und die Statusabfrage) soll aus deinem eigenen Programm heraus erfolgen. Nichtmal Druckerbenachrichtigungen bringen dich sonst weiter, nur ein Printermonitor.


Uebrigens ist die Sinnhaftigkeit des Druckerstatus umstritten und haengt sehr stark davon ab was der Drucker zurueckmeldet, bzw. zurueckmelden kann. Das muss nicht unbedingt immer sinnvoll sein.

bitsetter 20. Apr 2007 08:12

Re: Druckerstatus
 
Zitat:

Zitat von Olli
Interessanter als der Wert des Handles waere was GetLastError() zurueckgibt. Ich vermute mal, dass einer der Parameter CreateFile() nicht schmeckt, denn prinzipiell kann man Symlinks auf Geraete unter XP (und NT4/2000/2003 ...) sehr wohl per CreateFile() oeffnen. Uebrigens eine nette Analogie zu Linux' "/dev"-Verzeichnis ;)

Hallo,

Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
gibt bei mir WinXP die Nachricht "Das System kann die angegebene Datei nicht finden" aus.

Olli 20. Apr 2007 12:16

Re: Druckerstatus
 
Zitat:

Zitat von bitsetter
Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
gibt bei mir WinXP die Nachricht "Das System kann die angegebene Datei nicht finden" aus.

Wenn du - wie ich oben schon schrieb - Geraete als Dateien ansiehst, weisst du was dieser Fehler bedeutet. Der Name oder das Namensformat ist falsch ;)

Christoph Frank 20. Apr 2007 12:49

Re: Druckerstatus
 
Na, nun mal wieder zum Thema:
Keiner mehr da, dem noch etwas einfällt, was ich nun mit meinem Problem machen könnte?
Gruß Christoph

Olli 20. Apr 2007 12:56

Re: Druckerstatus
 
Zitat:

Zitat von Christoph Frank
Na, nun mal wieder zum Thema:
Keiner mehr da, dem noch etwas einfällt, was ich nun mit meinem Problem machen könnte?
Gruß Christoph

Wenn du es in deinem eigenen Programm machen willst, dann hast du die Loesung schon oben, wenn es in fremden Programmen gehen soll, brauchst du einen Printermonitor.

@bitsetter: Mich wuerde mal der Wert fuer TPrinterInfo2A(Buffer^).pPortName interessieren, den ihr bekommt.

Christoph Frank 20. Apr 2007 14:55

Re: Druckerstatus
 
Hallo Olli

in dem Feld steht bei mir 'EPUSB1:', dasselbe wie im Info.PortName. Ich habe einen EPSON Stylus DX5000 Series an USB1 angeschlossen.
Zu Deiner Antwort:

Ja, ich möchte die Lösung in meinem Programm vornehmen.
Nein, die obige Lösung bringt immer 'Drucker ist offline' weil die Vergleichswerte identisch sind.
:shock: Monitor??? , - mache Delphi erst seit 4 Monaten !!!

Gruß Christoph

Olli 20. Apr 2007 18:21

Re: Druckerstatus
 
Zitat:

Zitat von Christoph Frank
in dem Feld steht bei mir 'EPUSB1:', dasselbe wie im Info.PortName. Ich habe einen EPSON Stylus DX5000 Series an USB1 angeschlossen.

Lade dir mal bitte WinObj von Sysinternals runter und schaue unter \?? oder \GLOBAL??, ob du dort diesen Namen so findest. Ich finde den Doppelpunkt irgendwie eigenartig. Der suggeriert, dass es dort noch mit einem Pfad weitergeht. IMO muss der Doppelpunkt weg.

Zitat:

Zitat von Christoph Frank
Ja, ich möchte die Lösung in meinem Programm vornehmen.
Nein, die obige Lösung bringt immer 'Drucker ist offline' weil die Vergleichswerte identisch sind.

Dann brauchst du keinen Printermonitor. Das mit den Werten ist genau was ich sagte, es haengt deutlich vom Druckermodell und vom Anschlussport ab, ob die gemeldeten Statusinformationen auch der Wirklichkeit entsprechen. Es koennte also genausogut voellig normales Verhalten sein.

bitsetter 20. Apr 2007 21:09

Re: Druckerstatus
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Olli
@bitsetter: Mich wuerde mal der Wert fuer TPrinterInfo2A(Buffer^).pPortName interessieren, den ihr bekommt.

Unter Win98 wo es funktioniert USBPRN01 und unter WinXP wo es nicht funktioniert USB001. Bei mir also ohne Doppelpunkt.

Mit dem Tool WinObj konnte ich jedoch keinen ähnlichen Namen finden, im Bild ist ein Auszug davon.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.
Seite 2 von 3     12 3      

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