Tôi đang sử dụng Qt trên nền tảng cửa sổ.cách nhận id nhà cung cấp và id sản phẩm của thiết bị cắm USB trên các cửa sổ
tôi muốn nhận và hiển thị id nhà cung cấp và id sản phẩm của thiết bị USB được cắm từ hệ thống cục bộ của tôi.
Dưới đây là mã nguồn đầy đủ của tôi để lấy id nhà cung cấp và id sản phẩm từ thiết bị USB.
khi tôi chạy ứng dụng qt của mình, nó không phát sinh bất kỳ lỗi nào.
vì vậy tôi cắm thiết bị USB vào hệ thống.
nhưng tuyên bố trên báo của tôi hiển thị kết quả như sau
qDebug()<<pDetData->DevicePath;
tôi nhận được kết quả như 0x4
Cho dù tôi có bất kỳ sai lầm thực hiện trong mã nguồn của tôi?
nếu vậy hãy hướng dẫn tôi những gì tôi đang làm sai ..
Tôi có bỏ lỡ bất kỳ chức năng nào khác không?
Có thể lấy id nhà cung cấp và id sản phẩm từ thiết bị USB dựa trên mã nguồn của tôi hay không (thực hiện mã của tôi)?
vui lòng tìm mã nguồn của tôi dưới đây
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";
}
}
}
--------------- Edited thêm: ------------- ----
Hi ... các ứng dụng đi kèm và in này
\? \ usb # vid_04f2 & pid_0111 # 5 & 1ba5a77f 2 # {a5dcbf 1 0-6530-11d2-901f-00c04fb951ed}
một lần nữa nó đi tới, trong khi vòng lặp .... đây nó được breaked trong báo cáo khác ...
Qt Code:
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;
}
Mọi ý tưởng trong này ....
Bạn sẽ cần phải định dạng bức tường mã này tốt hơn nếu bạn muốn bất kỳ ai đọc mã đó. –
tôi định dạng lại mã ... – egrunin
tôi sao chép bình luận của bạn cho câu trả lời của tôi (dưới đây) và nối nó với câu hỏi của bạn (nơi nó thuộc về) – egrunin