Определение того, какое имя принтера соответствует какому идентификатору устройства

Моя цель - открыть принтер, подключенный через USB, используяCreateFile (а потом выпуститьWriteFiles иReadFiles).

Если бы принтер был 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 структура, это тоже будет ответом, хотя и менее удобный.

Ответы на вопрос(5)

Ваш ответ на вопрос