Ich verwende Qt auf Windows-Plattform.wie Vendor ID und Produkt-ID eines angeschlossenen USB-Gerät auf Windows
Ich möchte die Hersteller-ID und die Produkt-ID eines angeschlossenen USB-Geräts von meinem lokalen System abrufen und anzeigen.
Im Folgenden finden Sie meinen vollständigen Quellcode, um die Hersteller-ID und die Produkt-ID vom USB-Gerät abzurufen.
wenn ich die my qt-Anwendung ausführen, wirft es mir keine Fehler.
so stecke ich das USB-Gerät in das System.
aber meine print-Anweisung zeigt das Ergebnis, wie unten
qDebug()<<pDetData->DevicePath;
i das Ergebnis als 0x4
Ob ich in meinem Quellcode keine Implementierung Fehler haben bekommen?
wenn ja bitte leite mich, was ich falsch mache ..
habe ich verpasst keine anderen Funktionen aus?
Ist es möglich, die Hersteller-ID und die Produkt-ID von dem USB-Gerät basierend auf meinem Quellcode zu erhalten (meine Implementierung des Codes)?
freundlich meine Quellcode unter
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 hinzufügen finden: ------------- ----
Hallo ... die Anwendung kommt und druckt diese
\? \ usb # vid_04f2 & pid_0111 # 5 & 1ba5a77f 2 # {a5dcbf 1 0-6530-11d2-901f-00c04fb951ed}
wieder geht es Schleife um während .... hier ist es in der else-Anweisung ...
Qt-Code breaked wird:
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;
}
Irgendwelche Ideen in diesem ....
Sie müssen diese Codewand besser formatieren, wenn Sie sie lesen möchten. –
umformatiert ich den Code ... – egrunin
ich Ihren Kommentar zu meiner Antwort (unten) kopiert und den beigefügten es auf Ihre Frage (wo er hingehört) – egrunin