Averiguar qué nombre de impresora corresponde a qué ID de dispositivo

Mi objetivo es abrir una impresora conectada a través de USB usando elCreateFile (y luego emitir algunosWriteFiles yReadFiles).

Si la impresora fuera una LPT, simplemente haríaCreateFile("LPT1:", ...). Pero para las impresoras USB, hay una ruta de dispositivo especial que se debe pasar aCreateFile con el fin de abrir esa impresora.

Esta ruta del dispositivo,como pude encontrar, se recupera víaSetupDiGetClassDevs ->SetupDiEnumDeviceInterfaces ->SetupDiGetDeviceInterfaceDetail ->DevicePath miembro y se ve así:

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

Todo eso está bien, pero lo que tengo como entrada es el nombre de la impresora legible, tal como se ve enDevices and Printers. losSetupDi* Las funciones no parecen usar eso, solo funcionan enID de instancia de dispositivo. Así que la pregunta es ahoracómo obtener la ID de instancia del dispositivo del nombre de la impresora a la que se pasaríaOpenPrinter.

No es difícil observar que la parte GUID de lo anterior es laGUID_DEVINTERFACE_USBPRINTy\\?\usb es fijo, así que lo único que realmente me interesa esvid_0a5f&pid_0027#46a072900549#. Esta ruta puedo buscar fácilmente manualmente en el cuadro de diálogo de propiedades de la impresora:

Ir a Dispositivos e impresoras
Haga clic derecho en la impresora
Propiedades
Cambiar a la pestaña Hardware
Seleccione el dispositivo de impresión, como ZDesigner LP2844-Z
Propiedades
Cambiar a la pestaña de detalles
Seleccione 'Padre' en el menú desplegable.

Pero no tengo idea de cómo hacer eso de manera programática, lo único que se da es el nombre de la impresora como se ve en el panel Dispositivo e Impresoras.

PD 1: No estoy interesado en abrir la impresora conOpenPrinter y luego usandoWritePrinter / ReadPrinter. Eso se ha hecho, funciona bien, pero ahora el objetivo es diferente.

PD 2:Estaré bien con una forma más sencilla de convertir el nombre de la impresora legible en algo que se pueda pasar aCreateFile.

PD 3:Esta pregunta, a la que he publicado unresponder, está muy relacionado con lo que finalmente quiero hacer.

PD 4: Al revés también está bien:Si es posible obtener el nombre legible de laSP_DEVINFO_DATA Estructura, esa también será la respuesta., aunque menos conveniente.

Respuestas a la pregunta(5)

Su respuesta a la pregunta