Ustalenie, która nazwa drukarki odpowiada identyfikatorowi urządzenia

Moim celem jest otwarcie drukarki podłączonej przez USB za pomocąCreateFile (a następnie wydaj kilkaWriteFiles iReadFiles).

Gdyby drukarka była LPT, po prostu bym to zrobiłCreateFile("LPT1:", ...). Ale dla drukarek USB istnieje specjalna ścieżka urządzenia, która musi zostać przekazanaCreateFile w celu otwarcia tej drukarki.

Ta ścieżka urządzeniajak udało mi się znaleźć, jest pobierany przezSetupDiGetClassDevs ->SetupDiEnumDeviceInterfaces ->SetupDiGetDeviceInterfaceDetail ->DevicePath członek i wygląda tak:

\\?\usb#vid_0a5f&pid_0027#46a072900549#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}

Wszystko w porządku, ale to, co mam jako wejście, to czytelna dla człowieka nazwa drukarki, jak widać wDevices and Printers. TheSetupDi* funkcje nie wydają się tego używać, działają tylkoidentyfikatory instancji urządzenia. Więc pytanie jest terazjak uzyskać identyfikator instancji urządzenia z nazwy drukarki, do której ma zostać przekazanyOpenPrinter.

Nie trudno zauważyć, że część GUID powyższego jestGUID_DEVINTERFACE_USBPRINT, i\\?\usb jest naprawiony, więc jedynym, co mnie naprawdę interesuje, jestvid_0a5f&pid_0027#46a072900549#. Ta ścieżka mogę łatwo wyszukać ręcznie w oknie dialogowym właściwości drukarki:

Przejdź do Urządzenia i drukarki
Kliknij prawym przyciskiem myszy drukarkę
Nieruchomości
Przełącz na kartę Sprzęt
Wybierz urządzenie drukujące, takie jak ZDesigner LP2844-Z
Nieruchomości
Przełącz na kartę Szczegóły
Wybierz „Rodzic” z listy rozwijanej.

Ale nie mam pojęcia, jak to zrobić programowo, pod warunkiem że podana jest tylko nazwa drukarki widoczna na panelu Urządzenia i drukarki.

P.S. 1: Nie interesuje mnie otwieranie drukarki za pomocąOpenPrinter a następnie za pomocąWritePrinter / ReadPrinter. To zostało zrobione, działa dobrze, ale teraz cel jest inny.

P.S. 2:Będę w porządku z prostszym sposobem konwersji czytelnej nazwy drukarki na coś, co można przekazaćCreateFile.

P.S. 3:To pytanie, do której napisałemodpowiedź, jest bardzo powiązany z tym, co ostatecznie chcę zrobić.

P.S. 4: W drugą stronę jest również dobrze:Jeśli możliwe jest uzyskanie czytelnej nazwy zSP_DEVINFO_DATA struktura, która również będzie odpowiedzią, choć mniej wygodny.

questionAnswers(5)

yourAnswerToTheQuestion