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 algunsWriteFile
areiaReadFile
s).
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_USBPRINT
e\\?\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.