Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Druckerstatus abfragen (https://www.delphipraxis.net/191101-druckerstatus-abfragen.html)

baumina 8. Dez 2016 10:43

Druckerstatus abfragen
 
Hallo Ihr Lieben,

über das Thema habe ich nun schon einiges gelesen, das meiste endet aber irgendwie mit Win98. Gibt es eine Möglichkeit den Status eines Druckers Windows 7 und höher, egal ob dieser über USB oder Netzwerk erreichbar ist, mit oder ohne Spooler betrieben wird, mit Delphi abzufragen? Meine Versuche mit OpenPrinter/GetPrinter und PRINTER_INFO_2 haben eigentlich immer den Status 0 geliefert, egal, ob mein Drucker angeschlossen war oder nicht.

Interessant wäre für mich, ist der Drucker online oder offline und hat er Papier, also nur solch grundlegende Infos.

Danke für Eure Hilfe.

Aviator 8. Dez 2016 11:25

AW: Druckerstatus abfragen
 
Du könntest es ja mal über SNMP versuchen. Bestimmte MIBs sind da genormt. Vielleicht kannst du damit was anfangen.

himitsu 8. Dez 2016 12:29

AW: Druckerstatus abfragen
 
Ich sag es mal so:

Wenn ich auf unserem Netzwerkdrucker was drucke, dann bekommt selbest der Spooler nix mit.
* ist der andere Rechner an und der Drucker aus, dann wird das zumindestens gedruckt, wenn man den Drucker anschaltet (der andere Rechner-Spooler merkt sich das)
* ist der andere Rechner aus, dann geht der Druck ins Nirvana ... keine Ausdruck (nach anschalten des Rechners/Druckers) und vorallem auch keinerlei Fehlermeldung.

EmWieMichael 8. Dez 2016 12:58

AW: Druckerstatus abfragen
 
Das Abfragen der Druckereigenschaften funktioniert nach meinem Kenntnisstand nur, wenn vorher das Printerhandle initialisiert, sprich: ein Druckauftrag mit Printer.BeginDoc eingeleitet wird. Anschließend kann man über das Handle und GetDeviceCaps Informationen (DPI, Papiergröße, etc. )zum Drucker abfragen. So mach ich das jedenfalls :wink:

Die von Dir gewünschten Informationen sind (soweit ich weiß) nicht verfügbar; wenn der Drucker offline ist, wird das Handle nicht gültig sein; wenn der Drucker kein Papier hat, wird er nicht online sein (so ist das jedenfalls bei meinen Druckern).

p80286 8. Dez 2016 13:21

AW: Druckerstatus abfragen
 
Ist der Drucker lokal angeschlossen?
Wenn ja, hast du eine Chance, ansonsten bekommst Du irgendeine Rückmeldung die mit der Wirklichkeit nicht viel zu tun haben muß.

Gruß
K-H

baumina 8. Dez 2016 13:45

AW: Druckerstatus abfragen
 
Zitat:

Zitat von p80286 (Beitrag 1355686)
Ist der Drucker lokal angeschlossen?
Wenn ja, hast du eine Chance, ansonsten bekommst Du irgendeine Rückmeldung die mit der Wirklichkeit nicht viel zu tun haben muß.

Gruß
K-H

Für lokale Drucker würde mir das wahrscheinlich schon reichen.

TiGü 8. Dez 2016 15:18

AW: Druckerstatus abfragen
 
Vielleicht kannste mit WMI was reißen?
Arbeite dich mal in den WMI-Delphi Code Generator ein (https://theroadtodelphi.com/wmi-delphi-code-creator/)

Delphi-Quellcode:
//-----------------------------------------------------------------------------------------------------
//     This code was generated by the Wmi Delphi Code Creator (WDCC) Version 1.9.9.350
//     http://code.google.com/p/wmi-delphi-code-creator/
//     Blog http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/
//     Author Rodrigo Ruz V. (RRUZ) Copyright (C) 2011-2015 
//----------------------------------------------------------------------------------------------------- 
//
//     LIABILITY DISCLAIMER
//     THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
//     YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
//     DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
//
//----------------------------------------------------------------------------------------------------
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
 

   
// Stellt eine Druckerwarteschlange und die zugehörigen Einstellungen dar.

procedure GetMSFT_PrinterInfo;
const
  WbemUser           ='';
  WbemPassword       ='';
  WbemComputer       ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService  : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject  : OLEVariant;
  oEnum        : IEnumvariant;
  iValue       : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService  := FSWbemLocator.ConnectServer(WbemComputer, 'root\StandardCimv2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM MSFT_Printer','WQL',wbemFlagForwardOnly);
  oEnum        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Name   %s',[String(FWbemObject.Name)]));// String
      
    Writeln('');
    FWbemObject:=Unassigned;
  end;
end;


begin
 try
    CoInitialize(nil);
    try
      GetMSFT_PrinterInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;    
end.

baumina 8. Dez 2016 15:44

AW: Druckerstatus abfragen
 
Zitat:

Zitat von TiGü (Beitrag 1355718)
Vielleicht kannste mit WMI was reißen?
Arbeite dich mal in den WMI-Delphi Code Generator ein (https://theroadtodelphi.com/wmi-delphi-code-creator/)

Danke, das schau ich mir mal in Ruhe an, Ergebnis deines kleinen Programms war auf die Schnelle nämlich nur "Ungültiger Namespace 8004100E".

TiGü 8. Dez 2016 15:57

AW: Druckerstatus abfragen
 
Zitat:

Zitat von baumina (Beitrag 1355723)
Zitat:

Zitat von TiGü (Beitrag 1355718)
Vielleicht kannste mit WMI was reißen?
Arbeite dich mal in den WMI-Delphi Code Generator ein (https://theroadtodelphi.com/wmi-delphi-code-creator/)

Danke, das schau ich mir mal in Ruhe an, Ergebnis deines kleinen Programms war auf die Schnelle nämlich nur "Ungültiger Namespace 8004100E".

Ja, du musst den "root\StandardCimv2" gegen den bei dir gültigen ersetzen, aber lad dir mal den Generator runter und schau mal.

Jasocul 12. Dez 2016 07:05

AW: Druckerstatus abfragen
 
Wenn du Infos von Netzwerkdruckern brauchst, musst du unbedingt die dwFlags der PrinterOptions auf PRINTER_OPTION_NO_CACHE setzen.
Delphi-Quellcode:
...
  hPrinter : THandle;
  vPO : TPrinterOptions;
begin
...
  vPO.dwFlags := PRINTER_OPTION_NO_CACHE;
  vPO.cbSize := SizeOf(vPO);
  OpenPrinter2(PChar(PrinterName), @hPrinter, Nil, @vPO);
...


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 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