use*_*878 7 c++ windows usb winapi qt
我在Windows平台上使用Qt.
我想从本地系统获取并显示插入的USB设备的供应商ID和产品ID.
以下是我从USB设备获取供应商ID和产品ID的完整源代码.
当我运行我的qt应用程序时,它不会给我任何错误.
所以我将USB设备插入系统.
但我的print语句显示如下结果
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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
---------------编辑补充:-----------------
嗨...应用程序来打印这个
\?\ 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;
}
Run Code Online (Sandbox Code Playgroud)
这个想法....
在此之后:
SP_DEVICE_INTERFACE_DETAIL_DATA *pDetData = NULL;
Run Code Online (Sandbox Code Playgroud)
添加这个:
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);
Run Code Online (Sandbox Code Playgroud)
在此之后:
qDebug ()<<pDetData->DevicePath;
Run Code Online (Sandbox Code Playgroud)
添加这个:
free(pDetData);
Run Code Online (Sandbox Code Playgroud)
但最终你将不得不阅读文档SetupDiGetDeviceInterfaceDetail().这样做,有很多功能像这样工作,指向可变大小的结构.
--------编辑补充:--------
你真的错了.我看到你正在遵循你在这里得到的建议,这是你走错了路.idVendor并且idProduct只能在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);
Run Code Online (Sandbox Code Playgroud)
在此之后,udd->idVendor并udd->idProduct应该有你想要的东西.
微软曾经在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);
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅注释.
| 归档时间: |
|
| 查看次数: |
21131 次 |
| 最近记录: |