Statusabfrage an Drucker ergibt ERROR_INVALID_LEVEL
-
Hallo zusammen,
um Statusmeldungen vom Drucker zu bekommen, mache ich ein "GetPrinter(..)" zuerst auf "PRINTER_INFO_2" dann auf "PRINTER_INFO_6".
In unserer Systemumgebung funktioniert das alles.
Nun gibt es aber einen Fall, wo die Anwendung auf Windows XP läuft.
Dort geht das nur, wenn Drucker lokal eingebunden ist.
Wird dort der Drucker über einen Printserver aufgerufen, mit der Notation "\\XYZ\Printer1", gibt "GetPrinter(..)" eine 0 zurück,
und anschliessend wird über "GetLastEroor()" eben dieser "ERROR_INVALID_LEVEL" ermittelt.Ich weiss, eigentlich bekomme dieselben Statusmeldungen auch mit "PRINTER_INFO_2".
Aber trotzdem würde mich interessieren, warum es im aktuellen Fall mit der "..6" nicht geht
und vor allem, wie mache ich es richtig?
Wofür braucht man "PRINTER_INFO_6", wenn es die "PRINTER_INFO_2" auch täte?Meine Aufrufe nochmals im Quellcode:
nRet = GetPrinter(*phPrinter, 2, NULL, 0, &dwBytesNeeded); PRINTER_INFO_2* p2 = (PRINTER_INFO_2*) new BYTE[dwBytesNeeded]; nRet = GetPrinter(*phPrinter, 2, (LPBYTE)p2, dwBytesNeeded, &dwBytesReturned); if (nRet == 0){ // hier ist das Ergebnis noch "!= 0", also OK ... } nRet = GetPrinter(*phPrinter, 6, NULL, 0, &dwBytesNeeded); PRINTER_INFO_6* p6 = (PRINTER_INFO_6*) new BYTE[dwBytesNeeded]; nRet = GetPrinter(*phPrinter, 6, (LPBYTE)p6, dwBytesNeeded, &dwBytesReturned); if (nRet == 0){ ... // Hier bekomme ich von "GetLastError()" den "ERROR_INVALID_LEVEL" genannt.
Vielen Dank und Grüsse
Helmut
-
@elmut19 sagte in Statusabfrage an Drucker ergibt ERROR_INVALID_LEVEL:
ERROR_INVALID_LEVEL
Bei jedem Drucker?
Wofür braucht man "PRINTER_INFO_6", wenn es die "PRINTER_INFO_2" auch täte?
Weil es einfacher ist, weniger Daten liefert und natürlich auch das Netzwerk/OS dadurch weniger belastet.
-
@Martin-Richter
Danke Martin.Ich hatte beide Abfragen drin.
Also doppelt gemoppelt! Ist ja auch nicht gut.Aber es funktionierte bei uns beides immer, auch über den Printserver.
Dann hatte sich ein Kunde beschwert, dass bei ihm nicht gedruckt wird.Der hatte dann probiert, seinen Drucker mal direkt anzusprechen.
Dann hat er plötzlich gedruckt.Ich habe dann im Log nachgesehen, das ich dazu anlege.
Und da stand dann der Fehler ERROR_INVALID LEVEL für eben den Versuch mit "p6" drin.Jetzt habe ich den "p6" rausgeschmissen.
Aber warum was schiefgehen kann, weiss ich eben nicht.
-
Und ist das nur bei dem Drucker des Kunden.
Das kann auch am Druckertreiber liegen... der Befehl wird direkt durchgereicht.
-
@Martin-Richter
Mehr kann ich leider dazu nicht sagen, da ich die Infrastruktur dort nicht kenne.
Ich habe die Meldung von einem IT Mitarbeiter bekommen, der eigentlich schon weiss, was er macht.
Er konnte zumindest Alternativen ausprobieren, die dann funktionierten.
Bei uns hingegen hatte ich keine Probleme.
Ich werde es dann eben nur mit dem "p2" Block versuchen.
Danke Martin.
-
Ein weiteres Problem, das ich dadurch habe, ist, dass ich nicht weiss, ob durch ein schiefgelaufenes "GetPrinter(..)",
über das ich eigentlich nur den Status abfragen will, meine bisher schon aufgebaute Verbindung zum Drucker beendet wird.Im Grunde brauche ich das "GetPrinter(..)" nicht, um (zumindest bei uns) zu drucken.
Da die gewünschte Funktion aber ein AutoDruck ist, soll schon irgend ein Grund erkennbar sein, warum gerade nix aus dem Drucker kommt.
Würde man über einen Druck-Dialog, manuell gehen, bekommt man ja auf andere Weise eine Rückmeldung.
Zumindest geht man gleich der Sache am Drucker nach, wenn nix passiert.Meine Anwendung macht eben keinen Druck-Dialog auf.
Und wenn dann, statt zu drucken, nix passiert, ist eben die Anwendung schuld.
Also sollte man wenigstens im Logfile etwas finden können.Beim Kunden zu testen ist leider immer eine scheiss Variante.
Momentan habe ich die Drucker-Functions so zusammengefasst:
GetPrinterFromDialog(&cDrucken, &cPrintDeviceName, &pDevMode, ...); // Ohne "DoModal(..)" !! Also ohne User-Interaktion. OpenMyPrinter(&hPrinter, cPrintDeviceName, ...); GetPrinterAndStatus(&hPrinter, ...); // Das ist die Problem-Funktion mit dem "GetPrinter(..)" und Status-abfrage CreatePrinterDCandStart(&cDrucken, &hPrinter, ...);
Bei Fehlern in den einzelnen Funktionsaufrufen breche ich den Druckvorgang ab und schreibe ins Logfile.
Aber wie gehe ich da besser vor?
Kann ich das erste "GetPrinter(..)", das fehlschlägt, ignorieren und versuche es dann mit dem nächsten, bis eines geht?
Und wenn ich dann trotzdem noch so ein ERROR_INVALID_LEVEL bekomme, drucke ich trotzdem?