Ermitteln, welcher Druckername welcher Geräte-ID entspricht

Mein Ziel ist es, einen über USB angeschlossenen Drucker über das zu öffnenCreateFile (und dann einige ausstellenWriteFiles undReadFiles).

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.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage