Определение того, какое имя принтера соответствует какому идентификатору устройства
Моя цель - открыть принтер, подключенный через USB, используяCreateFile
(а потом выпуститьWriteFile
s иReadFile
s).
Если бы принтер был LPT, я бы просто сделалCreateFile("LPT1:", ...)
. Но для USB-принтеров есть специальный путь к устройству, который необходимо передать вCreateFile
чтобы открыть этот принтер.
Это путь к устройству, как я смог найти, получается черезSetupDiGetClassDevs
->SetupDiEnumDeviceInterfaces
->SetupDiGetDeviceInterfaceDetail
->DevicePath
member и выглядит так:
\\?\usb#vid_0a5f&pid_0027#46a072900549#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}
Все хорошо, но то, что я имею в качестве ввода, - это удобочитаемое имя принтера, как видно изDevices and Printers
.SetupDi*
функции, кажется, не используют это, они работают только на идентификаторы экземпляра устройства. Так что вопрос сейчас Как получить идентификатор экземпляра устройства из имени принтера, который можно передатьOpenPrinter
.
Нетрудно заметить, что часть GUID, описанная выше, являетсяGUID_DEVINTERFACE_USBPRINT
, а также\\?\usb
исправлено, поэтому единственное, что меня действительно интересует, этоvid_0a5f&pid_0027#46a072900549#
. Этот путь я могу легко найти вручную в диалоговом окне свойств принтера:
Перейти к устройствам и принтерам
Щелкните правой кнопкой мыши на принтере
Свойства
Переключиться на вкладку «Оборудование»
Выберите печатающее устройство, например ZDesigner LP2844-Z
Свойства
Переключиться на вкладку «Сведения»
Выберите «Родитель» из выпадающего списка.
Но я понятия не имею, как это сделать программно, при условии, что единственное, что было указано, - это имя принтера, отображаемое на панели «Устройство и принтеры».
P.S. 1: я не заинтересован в открытии принтера сOpenPrinter
и затем с помощьюWritePrinter
/ ReadPrinter
. Это было сделано, работает отлично, но теперь цель другая.
P.S. 2: У меня все будет в порядке с более простым способом преобразования читаемого имени принтера во что-то, что можно передать вCreateFile
.
P.S. 3:Этот вопро, на который я отправилотве, очень связано с тем, что я в конечном итоге хочу сделать.
P.S. 4: Обратный путь тоже хорошо: Если можно получить читаемое имя изSP_DEVINFO_DATA
структура, это тоже будет ответом, хотя и менее удобный.