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 kilkaWriteFile
s iReadFile
s).
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.