Ermitteln, welcher Druckername welcher Geräte-ID entspricht
Mein Ziel ist es, einen über USB angeschlossenen Drucker über das zu öffnenCreateFile
(und dann einige ausstellenWriteFile
s undReadFile
s).
Wenn der Drucker ein LPT wäre, würde ich einfach tunCreateFile("LPT1:", ...)
. Für USB-Drucker muss jedoch ein spezieller Gerätepfad übergeben werdenCreateFile
um diesen Drucker zu öffnen.
Dieser Gerätepfad,wie ich finden konntewird abgerufen überSetupDiGetClassDevs
->SetupDiEnumDeviceInterfaces
->SetupDiGetDeviceInterfaceDetail
->DevicePath
Mitglied und sieht so aus:
\\?\usb#vid_0a5f&pid_0027#46a072900549#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}
Das ist alles in Ordnung, aber was ich als Eingabe habe, ist der von Menschen lesbare Druckername, wie in zu sehenDevices and Printers
. DasSetupDi*
Funktionen scheinen das nicht zu nutzen, sie wirken nur aufGeräteinstanz-IDs. Die Frage ist also jetztWie erhält man die Geräteinstanz-ID von dem Druckernamen, an den man übergeben würde?OpenPrinter
.
Es ist nicht schwer zu beobachten, dass der GUID-Teil des oben genannten der istGUID_DEVINTERFACE_USBPRINT
, und\\?\usb
ist behoben, also ist das einzige, woran ich wirklich interessiert binvid_0a5f&pid_0027#46a072900549#
. Diesen Pfad kann ich im Druckereigenschaftendialog leicht manuell nachschlagen:
Wechseln Sie zu Geräte und Drucker
Klicken Sie mit der rechten Maustaste auf den Drucker
Eigenschaften
Wechseln Sie zur Registerkarte Hardware
Wählen Sie das Druckgerät aus, z. B. ZDesigner LP2844-Z
Eigenschaften
Wechseln Sie zur Registerkarte Details
Wählen Sie "Übergeordnet" aus der Dropdown-Liste.
Ich habe jedoch keine Ahnung, wie dies programmgesteuert erfolgen soll, vorausgesetzt, es wird nur der Druckername angegeben, der im Bedienfeld „Gerät und Drucker“ angezeigt wird.
P.S. 1: Ich bin nicht daran interessiert, den Drucker mit zu öffnenOpenPrinter
und dann mitWritePrinter
/ ReadPrinter
. Das ist gelungen, funktioniert gut, aber jetzt ist das Ziel anders.
P.S. 2:Ich bin mit einer einfacheren Möglichkeit einverstanden, den lesbaren Druckernamen in einen Namen zu konvertieren, der übergeben werden kannCreateFile
.
P.S. 3:Diese Frage, auf die ich eine gepostet habeAntworten, hängt sehr mit dem zusammen, was ich letztendlich machen möchte.
P.S. 4: Der umgekehrte Weg ist auch in Ordnung:Wenn es möglich ist, den lesbaren Namen von der zu erhaltenSP_DEVINFO_DATA
Struktur, das wird auch die Antwort sein, obwohl weniger bequem.