gpt4 book ai didi

c++ - 如何在 Windows 上获取插入的 USB 设备的供应商 ID 和产品 ID

转载 作者:可可西里 更新时间:2023-11-01 13:06:42 31 4
gpt4 key购买 nike

我在windows平台上使用Qt。

我想从我的本地系统获取并显示插入的 USB 设备的供应商 ID 和产品 ID。

下面是我从 USB 设备获取供应商 ID 和产品 ID 的完整源代码。

当我运行我的 qt 应用程序时,它不会抛出任何错误。

所以我将 USB 设备插入系统。

但是我的打印语句显示的结果如下

qDebug ()<<pDetData->DevicePath;

我得到的结果是 0x4

我的源代码中是否有任何实现错误?

如果是这样,请指导我我做错了什么..

我是否错过了任何其他功能?

是否可以根据我的源代码(我的代码实现)从 USB 设备获取供应商 ID 和产品 ID?

请在下面找到我的源代码

static GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10L, 0x6530, 0x11D2, 
{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };

HANDLE hInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE,NULL,NULL,
DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

if ( hInfo == INVALID_HANDLE_VALUE )
{
qDebug ()<<"invalid";
}
else
{
qDebug ()<<"valid handle";

SP_DEVINFO_DATA DeviceInfoData;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

SP_INTERFACE_DEVICE_DATA Interface_Info;
Interface_Info.cbSize = sizeof(Interface_Info);

BYTE Buf[1024];
DWORD i;
DWORD InterfaceNumber= 0;

PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd =
(PSP_DEVICE_INTERFACE_DETAIL_DATA) Buf;

for (i=0;SetupDiEnumDeviceInfo(hInfo,i,&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;

while (!SetupDiGetDeviceRegistryProperty( hInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}

qDebug ()<<(TEXT("Device Number %i is: %s\n"),i, buffer);

if (buffer) LocalFree(buffer);

if ( GetLastError() != NO_ERROR
&& GetLastError() != ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
qDebug ()<<"return false";
}

InterfaceNumber = 0; // this just returns the first one, you can iterate on this

if (SetupDiEnumDeviceInterfaces(hInfo,
NULL,
&GUID_DEVINTERFACE_USB_DEVICE,
InterfaceNumber,
&Interface_Info))
{
printf("Got interface");
DWORD needed;
pspdidd->cbSize = sizeof(*pspdidd);
SP_DEVICE_INTERFACE_DETAIL_DATA *pDetData = NULL;
DWORD dwDetDataSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA)
+ 256;

SetupDiGetDeviceInterfaceDetail(hInfo,
&Interface_Info, pDetData,dwDetDataSize, NULL,
&DeviceInfoData);

qDebug ()<<pDetData->DevicePath;
//qDebug ()<<QString::fromWCharArray(pDetData->DevicePath);
}
else
{
printf("\nNo interface");

//ErrorExit((LPTSTR) "SetupDiEnumDeviceInterfaces");

if ( GetLastError() == ERROR_NO_MORE_ITEMS)
printf(", since there are no more items found.");
else
printf(", unknown reason.");

}
// Cleanup

SetupDiDestroyDeviceInfoList(hInfo);
qDebug ()<<"return true";
}
}
}

---------------- 编辑添加:----------------

嗨...应用程序来打印这个

\?\usb#vid_04f2&pid_0111#5&1ba5a77f&0&2#{a5dcbf1 0-6530-11d2-901f-00c04fb951ed}

再次进入 while 循环....在这里它在 else 语句中被破坏...

Qt代码:

if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { 
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
} else {
qDebug ()<<"Here it quits the application";
// Insert error handling here. break;
}

任何想法......

最佳答案

在这一行之后:

SP_DEVICE_INTERFACE_DETAIL_DATA *pDetData = NULL;

添加这个:

DWORD dwDetDataSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + 256;
pDetData = (_SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc (dwDetDataSize);
pDetData->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);

在这一行之后:

qDebug ()<<pDetData->DevicePath;

添加这个:

free(pDetData);

但最终您将不得不阅读 SetupDiGetDeviceInterfaceDetail() 的文档.做吧,有很多函数是这样工作的,带有指向可变大小结构的指针。

-------- 编辑添加:--------

你的做法真的是错误的。我看到你正在听从你得到的建议 here , 它带你走上了错误的道路。 idVendoridProduct 只能在 USB_DEVICE_DESCRIPTOR ( MSDN ) 中找到。

看起来您已经知道如何获取设备句柄(使用 CreateFile())。之后,调用 WinUsb_Initialize() ( MSDN )。这将为您提供 WINUSB_INTERFACE_HANDLE

获得该句柄后,您想要调用 WinUsb_GetDescriptor() ( MSDN ),并将 DescriptorType 设置为 URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE。我现在无法测试代码,但它看起来像这样:

USB_DEVICE_DESCRIPTOR udd;
memset(&udd, 0, sizeof(udd));
ULONG LengthTransferred = 0;

WinUsb_GetDescriptor(
winusb_interface_handle, // returned by WinUsbInitialize
URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE,
0, // not sure if we need this
0x409, // not sure if we need this
&udd,
sizeof(udd),
&LengthTransferred);

在那之后,udd->idVendorudd->idProduct 应该有你想要的。

Microsoft 过去常常在 DDK 中为所有这些提供示例代码,现在可能还在提供,但我没有权限访问。

------------ 编辑添加:------------

Daniel K 写道,代码实际上应该是:

USB_DEVICE_DESCRIPTOR udd;
memset(&udd, 0, sizeof(udd));
ULONG LengthTransferred = 0;

WinUsb_GetDescriptor(
winusb_interface_handle, // returned by WinUsbInitialize
USB_DEVICE_DESCRIPTOR_TYPE, // Daniel K's suggestion
0,
0x409, // asks for English
&udd,
sizeof(udd),
&LengthTransferred);

有关详细信息,请参阅评论。

关于c++ - 如何在 Windows 上获取插入的 USB 设备的供应商 ID 和产品 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2935184/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com