![]() |
Statusinformation über ein Drucker
Hallo,
ich möchte gerne über den Standarddrucker folgende Informationen erfahren:
Das Problem ist nur, dass mir die Windows API Funktion entweder den Wert 0 für nichts oder den Status Angehalten zurück gibt. Die anderen Statuse zeigt er mir nicht an, weil es nicht geht anscheinend. Hat jemand von Euch einen Lösungsansatz, wie ich an diese Informationen ran komme? Beste Grüße, Dank und noch einen schönen Festtag Ulrich |
Re: Statusinformation über ein Drucker
Schau mal hier:
![]() Zugegeben etwas antiquiert und funzt auch nur auf NT-Systemen, aber das sollte ja nicht das Problem sein. Ansonsten gibt es im PSDK noch ein Codebeispiel aber mit Polling (für Win9x). |
Re: Statusinformation über ein Drucker
Um Infos über den Druckerstatus zu erfahren, steht einem das Interrupt 17h und das Druckerstatus-Byte zur Verfügung.
Delphi-Quellcode:
Nun zu den einzelnen Bits und ihrer Bedeutung:
function LeseStatusByte: Byte;
asm MOV AH, 02h XOR DX, DX //setzt DX-Register auf null INT 17h //löst Software-Interrupt für den Drucker aus(Funktion 02h-->Status-Byte des Druckers auslesen) MOV Result, AH //Status-Byte wird aus dem Register gesogen und einer Variablen übergeben end; Bit 0: Time-Out/Reserviert Bit 1+2: Reserviert Bit 3: 1 = Ein-/Ausgabefehler Bit 4: 1 = Drucker ist online Bit 5: 1 = Kein Papier Bit 6: 1 = Empfangsbestätigung Bit 7: 1 = Drucker ist bereit
Delphi-Quellcode:
const
PM_EA_ERROR = $08; PM_ONLINE = $10; PM_NOPAPER = $20; PM_ACKNOWLEDGEMENT =$40; PM_READY = $80; : if(LeseStatusByte and PM_NOPAPER=PM_NOPAPER)then ShowMessage('Sorry Atze, keen Papier mehr!'); : |
Re: Statusinformation über ein Drucker
Hi,
![]() Chris |
Re: Statusinformation über ein Drucker
@MaOfDe: Faszinierende Idee! Programmieren wir mit Delphi oder mit Turbo-Pascal? Du scheinbar noch mit Turbo-Pascal. Das was du vorschlägst funktioniert wunderbar unter Windows 9x und DOS. Unter Windows NT/2000/XP/2003/Longhorn/Everest und wie die designierten Nachfolger alle heißen, hast du damit herzliche Probleme. Abgesehen davon, ist es Sache des OS ob der Interrupt umgebogen wird oder nicht! Also auch unter Win9x kann man damit böse auf die Nase fallen (theoretisch!). Weiterhin gibt es nicht nur die guten alten (LPT-)Drucker die auch unter DOS oder beliebigen OS laufen, sondern auch USB-Drucker (was zu verschmerzen sein mag - ich kenne das Interrupt-Mapping dort nicht) UND (viel wichtiger!) sog. GDI-Drucker, die direkt die Windows-Ressourcen und die darunterliegenden APIs benutzen. Die werden vermutlich nicht auf solche Versuche reagieren, da sie nichtmal mit einem simplen Standarddruckertreiber klar kommen. Gute Beispiele für solche Drucker sind Lexmark-Drucker - sog. "Windows-Drucker".
In diesem Sinne: Hinsetzen, Hausaufgaben nochmal machen :mrgreen: Nachtrag: Das soll jetzt keinesfalls meine Lösung "promoten", da diese sowieso nur auf NT-basierten Systemen läuft. Aber selbst verglichen mit dem recht altmodischen Polling unter Win9x ist deine Methode wie eine Steinaxt mit der man auf das System eindrischt. [edit]Assarbad: falsch gesetzte Satzzeichen korrigiert.[/edit] |
Re: Statusinformation über ein Drucker
@Assarbad: Autsch! Danke für die Belehrung! Hab leider nur Windows 98 auf menen Rechner(allet andre traut sich nich rauf). Hab ich zum Glück noch in kenem Programm eingebaut. Habn nützliches Buch in 'ner Bibliothek gefunden... steht alles mögliche drin, wie Windows/DOS/BIOS arbeiten... is aber mehr ne Referenz als n Lehrbuch. Stehn auch wirklich ALLE Interrupts drin, doch leider, oh graus, es is' von 1992.
Für menen Rechner reichts aba allemal 8) . |
Re: Statusinformation über ein Drucker
Verständlich. Von '92, dann ist es klar ;) ... eigentlich war Windows 98 schon 1998 nicht mehr auf dem aktuellen Stand der Technik. Also, wenn du sowas mit direktem Hardwarezugriff machst, solltest du normalerweise gleich einen Treiber schreiben, denn die sind für sowas zuständig. Daß Win9x sowas erlaubt ist vielmehr eine Schwäche dieser Systeme.
Icke faschteh och gornich watte sachst, wail du so bahlinast :mrgreen: Oliver |
Re: Statusinformation über ein Drucker
Net schlescht, halt misch aba trotzdem noch zurück mit mener 'Heematsprache', sonst kriecht det jeman' no' falsch in'n Kopp rinn unn det führt wah'scheenlisch zu unhervorsehban Komplikationen :mrgreen: !!
Wo wir grad bei Berlin sinn, hier is ens mener Topics :lol: : ![]() Kam leider niemand uff die Idee(bis uff 2 o. 3) selber sone Codes zu posten :( . Nochmal dazu: Zitat:
Treiber schreiben??? Kennste empfehlenswerte Tuts, würde mich interessieren... |
Re: Statusinformation über ein Drucker
schau hier: :cry:
raik |
Re: Statusinformation über ein Drucker
Ich habe mich damit begnügt, dass so was nur schwer möglich ist und ich überwache jetzt immer die Druckerwarteschlange. Hoffen wir auf Longhorn, dass es damit vielelicht besser wird.
Ulrich PS: Danke für die Antworten. |
Re: Statusinformation über ein Drucker
Man nehme NT 4.0, 5.0 (aka 2000), 5.1 (aka XP), 5.2 (aka 2003) oder Longhorn ... alle haben die entsprechenden APIs (die von meinem oben erwähnten Programm benutzt werden) eingebaut.
|
Re: Statusinformation über ein Drucker
Hi,
nur was Dein Programm auch nicht leisten kann, anzuzeigen, ob der Drucker an oder aus ist, ohne dass man ein Druckauftrag sendet bzw. es reagiert nicht, wenn der Drucker an- bzw. ausgeschaltet wird. Das würde ich gerne haben. Windows stellt zwar eine entspechende Struktur zur Verfügung (PRINTER_INFO_2), die in der Theorie auch die Ergebnisse liefern soll über ein Drucker, nur ist das Ergebnis, siehe mein erstes Post, immer 0 bis auf eine ausnahme). Beste Grüße Ulrich |
Re: Statusinformation über ein Drucker
Liste der Anhänge anzeigen (Anzahl: 1)
Zuerst mal zur "Meer"-Zahl des hier häufig zitierten Status, das sind die Statisten oder kurz Stati. :wink:
Mit dem Thema ob ein Drucker an, aus oder überhaupt noch da ist hab ich mich schon einige Zeit erfolglos rumgeschlagen. Fazit war bisher immer dass MS das Prinzip Hoffnung vertritt und davon ausgeht der Drucker täte so man ihn benutzen wolle. Ob das dann auch so ist funktioniert nur wie das Allozieren von Speicher. Da erzeugt man auch erst mal einen Fehler der einem sagt wieviel eigentlich fehlt. Zur Frage: Zitat:
Bei wirklich kritischen Druckjobs fällt mir nur ein schizophrener Workaround ein: ´ne WEB-Cam installieren und in Delphi eine Bildmustererkennung schreiben die auf die Onlinediode und den Unterschied von weissem Papier zu grauem Schacht reagiert. Da ist dann der Grafikcorner gefragt. :lol: Falls dennoch jemand eine Lösung dafür entdeckt bitte nicht vergessen mich zu informieren. :!: Bis dahin hab ich noch nen Kopierdialog der auch für das leidige Druckthema geeignet wäre :wall: Have fun - Bernd |
Re: Statusinformation über ein Drucker
Zitat:
Zitat:
Wie jetzt? Fazit dieses Themas ist demnach, daß Windows nicht darüber informieren kann, ob der Drucker an oder aus ist? :gruebel: |
Re: Statusinformation über ein Drucker
Hallo Olli,
Zitat:
Zitat:
2004 (C) by Bernd. Ähnlichkeiten mit lebenden oder verstorbenen Dialogen wären rein zufällig... :zwinker: Am Rande, auch wenn das das Problem nicht Löst, hat die Toolbox ( ![]() So betrachtet war der Int 17 früher eigentlich fortschrittlicher oder zumindest in diesem Kontext informativer als der virtuelle "Drucker" den uns ein Treiber heute über dem Hardware Abstraction Layer vorgaukelt. Wieso mir jetzt bei HAL schon wieder Stanley Kubrics 2001 - Odysee im Weltraum einfällt und was dabei raus kommt wenn man die Buchstaben jeweils um 1 decreased... :?: Have fun, Bernd |
Re: Statusinformation über ein Drucker
Zitat:
|
Re: Statusinformation über ein Drucker
...schITt..., nein, wollte sagen increased, das ist dann "IBM" und ungesicherte Quellen munkeln das wäre Stanley´s Absicht gewesen.
Nochmal zum Interrupt, es gibt irgendwo in den Weiten des Netzes ein Inpout32.dll die unter NT/2000/XP die Ports lesen und schreiben kann. Genauer bei ![]() Ich muss mal probieren, ob damit zumindest was über den/die lokalen Drucker an LPT raus zu kriegen ist wie zu alten Zeiten als die Mäuse noch Nager o.ä. waren und die Windows noch Griffe hatten und dazu gedacht waren raus anstatt rein zu gucken. :zwinker: Am Rande, damals war das "Papierlose Büro" noch eher Wirklichkeit als heute und mein Freund der Baum musste nicht ob irgendwelcher obskurer Ausdrucke zu Layoutzwecken geopfert werden. :cry: Doch zurück in die Gegenwart: Netzwerk-, GDI- und USB-Drucker bleiben natürlich noch immer aussen vor bei dieser Lösung obwohl sie langsam Überhand bekommen und so mach ich mir Gedanken ob das mit den Ports die Zeit wert ist. Gruß, Bernd |
Re: Statusinformation über ein Drucker
Wenn ihr wirklich kritisch den Status eines Druckers braucht, wäre es dann nicht mal nen Gedanken wert, ob sich ein Drucker lohnt, der sowas mitbringt? Zum Beisipiel ein Zebra oder Birch?
Ich habe von denen bisher nur mit Etikettendruckern gearbeitet, aber aufgrund einer eigenen Sprache liefern die auch Status-Flags zurück, für so ziemlich alles was man braucht (Druckmittel leer, Etiketten leer, Drucke, StandBy, Aufträge insgesamt, etc.). Kann man alle über Parallel- oder Seriellport ansprechen bzw. über LAN, wenn die nicht antworten, sind sie aus oder nicht da^^ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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