Descobrir qual nome de impressora corresponde a qual ID de dispositivo

Meu objetivo é abrir uma impressora conectada via USB usando oCreateFile (e, em seguida, emitir algunsWriteFileareiaReadFiles).

Se a impressora fosse LPT, eu simplesmente fariaCreateFile("LPT1:", ...). Mas para impressoras USB, há um caminho de dispositivo especial que deve ser passado paraCreateFile para abrir essa impressora.

Este caminho do dispositivo,como consegui encontrar, é recuperado viaSetupDiGetClassDevs ->SetupDiEnumDeviceInterfaces ->SetupDiGetDeviceInterfaceDetail ->DevicePath membro e se parece com isso:

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

Tudo isso é bom, mas o que eu tenho como entrada é o nome da impressora legível, como visto emDevices and Printers. oSetupDi* funções não parecem usar isso, eles só operam emIDs de instância do dispositivo. Então a questão é agoracomo obter o ID da instância do dispositivo do nome da impressora que seria transmitidoOpenPrinter.

Não é difícil observar que a parte GUID do acima é oGUID_DEVINTERFACE_USBPRINTe\\?\usb é fixo, então o único pedaço que eu estou realmente interessado évid_0a5f&pid_0027#46a072900549#. Esse caminho eu posso facilmente procurar manualmente na caixa de diálogo de propriedades da impressora:

Vá para Dispositivos e Impressoras
Clique com o botão direito na impressora
Propriedades
Alternar para a guia Hardware
Selecione o dispositivo de impressão, como ZDesigner LP2844-Z
Propriedades
Mude para o separador Detalhes
Selecione "Parent" no menu suspenso.

Mas eu não tenho idéia de como fazer isso de forma programática, desde que a única coisa dada seja o nome da impressora, como visto no painel Dispositivos e Impressoras.

P.S. 1: Não estou interessado em abrir a impressora comOpenPrinter e depois usandoWritePrinter / ReadPrinter. Isso foi feito, funciona bem, mas agora o objetivo é diferente.

P.S. 2:Eu vou ficar bem com uma maneira mais simples de converter o nome da impressora legível para algo que pode ser passado paraCreateFile.

P.S. 3:Essa questão, para o qual eu postei umresponda, está muito relacionado ao que eu quero fazer.

P.S. 4: O contrário também está bem:Se for possível obter o nome legível a partir doSP_DEVINFO_DATA estrutura, que também será a resposta, embora menos conveniente.

questionAnswers(5)

yourAnswerToTheQuestion