SetupDiGetClassDevs-从deviceinstanceid获取USB设备中显示的名称



我连接了一台没有驱动程序的打印机,它不会显示在打印机下,但会显示在"开始->设置->蓝牙和其他设备"下,名称为"SRP300"。

我可以通过以下例程将数据发送到打印机(可在此处找到:https://www.levelextreme.com/ViewPageGenericLogin.aspx?LoadContainer=1&NoThread=1157607(,它在哪里获得设备实例ID和Guid,但我根本无法确定从"SP300"中获得名称的位置。

一旦找到它的GUID,我需要调用什么?最好的方法是,我可以搜索要开始的名称,如果找到SP300,然后获取实例id/guid,但我尝试了不同的枚举方法来获取显示的名称,但似乎没有产生它。

如果我检查注册表,我可以看到它被分组在USB下,然后被分组在一个名为USBPRINT的文件夹下,然后是一个文件夹00000001,里面有名称,但我想知道我如何通过Win-api调用来检索它?

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("%urn", MemberIndex);
;
return 0;
}

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

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

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

谨致问候,

Baron Bi

最新更新