SetupDiGetClassDevs-USB设备-是否要从deviceinstanceid获取USB设备中显示的名称?

时间:2018-11-02 18:17:04

标签: winapi

我连接的打印机没有驱动程序,并且没有显示在打印机下,但是显示在名称为“ SRP300”的“开始->设置->蓝牙和其他设备”下。

我可以通过以下例程将数据发送到打印机(在此处找到:https://www.levelextreme.com/ViewPageGenericLogin.aspx?LoadContainer=1&NoThread=1157607),在该例程中它获得设备实例ID和Guid-但我根本无法弄清楚我在哪里获得该名称从“ SP300”开始?

一旦我找到它的GUID,我需要调用什么?最好的办法是,如果我可以搜索以该名称开头的名称,并且找到了SP300,则获取实例ID / GUID,但是我尝试了各种枚举方法来枚举显示的名称,但似乎什么都没有产生?

如果我检查注册表,我会看到它分组在USB下,然后在一个名为USBPRINT的文件夹下,然后是一个00000001文件夹,并在其中命名,但是想知道如何通过win api调用检索到它吗? / p>

int test2()
{
int           MemberIndex = 0;
LONG          Result = 0;
DWORD         Length = 0;
HANDLE        hDevInfo;
ULONG         Required;

HANDLE m_hComm=NULL;

PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = NULL;

SP_DEVICE_INTERFACE_DATA  devInfoData;

hDevInfo = SetupDiGetClassDevs((LPGUID)&(USB_PRINT), NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

if (hDevInfo == INVALID_HANDLE_VALUE)
{

    printf("No hardware device");
    return 0;
}

devInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

//Step through the available devices looking for the one we want. 
do
{
    //[1]
    Result = SetupDiEnumDeviceInterfaces(hDevInfo, 0, (LPGUID)&(USB_PRINT), MemberIndex, &devInfoData);
    if (Result != 0)
    {
        SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInfoData, NULL, 0, &Length, NULL);
        //Allocate memory for the hDevInfo structure, using the returned Length.

        detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)new BYTE[Length * 4];
        //Set cbSize in the detailData structure.

        detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
        //Call the function again, this time passing it the returned buffer size.

        if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInfoData, detailData, Length, &Required, NULL) == TRUE)
        {
            m_hComm = CreateFile(detailData->DevicePath,
                GENERIC_READ | GENERIC_WRITE,
                NULL,
                NULL,
                OPEN_EXISTING, 0, NULL);
            if (m_hComm != INVALID_HANDLE_VALUE)
            {
                //Result = 0;
                printf("USB port Available");
            }
            CloseHandle(m_hComm);
        }
        delete(detailData);
    }
    MemberIndex = MemberIndex + 1;

} while (Result != 0);

SetupDiDestroyDeviceInfoList(hDevInfo);

printf("%u\r\n", MemberIndex);
;
return 0;
}

1 个答案:

答案 0 :(得分:0)

如果未使用枚举参数值来选择设备,请将Enumerator设置为NULL,并且当Enumerator为NULL时,SetupDiGetClassDevs将为所有PnP枚举器返回设备。您可以将此参数设置为值的全局唯一标识符(GUID)或符号名。

有关更多信息,您可以在下面参考此文档。

https://docs.microsoft.com/en-us/windows/desktop/api/setupapi/nf-setupapi-setupdigetclassdevsw

最好的问候,

毕男爵