Meine SetupDiEnumDeviceInterfaces nicht funktioniert
Kann jemand sehen, wenn ich das Tue, dieses Recht bitte:
//DeviceManager.h
#include <windows.h>
//#include <hidsdi.h>
#include <setupapi.h>
#include <iostream>
#include <cfgmgr32.h>
#include <tchar.h>
#include <devpkey.h>
extern "C"{
#include <hidsdi.h>
}
//#pragma comment (lib, "setupapi.lib")
class DeviceManager
{
public:
DeviceManager();
~DeviceManager();
void ListAllDevices();
void GetDevice(std::string vid, std::string pid);
HANDLE PSMove;
byte reportBuffer;
private:
HDEVINFO deviceInfoSet; //A list of all the devices
SP_DEVINFO_DATA deviceInfoData; //A device from deviceInfoSet
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailedData;
};
//DeviceManager.cpp
#include"DeviceManager.h"
DeviceManager::DeviceManager()
{
deviceInfoSet = SetupDiGetClassDevs(NULL, TEXT("USB"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); //Gets all Devices
}
DeviceManager::~DeviceManager()
{
}
void DeviceManager::ListAllDevices()
{
DWORD deviceIndex = 0;
deviceInfoData.cbSize = sizeof(deviceInfoData);
while(SetupDiEnumDeviceInfo(deviceInfoSet, deviceIndex, &deviceInfoData))
{
deviceInfoData.cbSize = sizeof(deviceInfoData);
ULONG tcharSize;
CM_Get_Device_ID_Size(&tcharSize, deviceInfoData.DevInst, 0);
TCHAR* deviceIDBuffer = new TCHAR[tcharSize]; //the device ID will be stored in this array, so the tcharSize needs to be big enough to hold all the info.
//Or we can use MAX_DEVICE_ID_LEN, which is 200
CM_Get_Device_ID(deviceInfoData.DevInst, deviceIDBuffer, MAX_PATH, 0); //gets the devices ID - a long string that looks like a file path.
/*
//SetupDiGetDevicePropertyKeys(deviceInfoSet, &deviceInfoData, &devicePropertyKey, NULL, 0, 0);
if( deviceIDBuffer[8]=='8' && deviceIDBuffer[9]=='8' && deviceIDBuffer[10]=='8' && deviceIDBuffer[11]=='8' && //VID
deviceIDBuffer[17]=='0' && deviceIDBuffer[18]=='3' && deviceIDBuffer[19]=='0' && deviceIDBuffer[20]=='8') //PID
{
std::cout << deviceIDBuffer << "\t<-- Playstation Move" << std::endl;
}
else
{
std::cout << deviceIDBuffer << std::endl;
}*/
std::cout << deviceIDBuffer << std::endl;
deviceIndex++;
}
}
void DeviceManager::GetDevice(std::string vid, std::string pid)
{
DWORD deviceIndex = 0;
deviceInfoData.cbSize = sizeof(deviceInfoData);
while(SetupDiEnumDeviceInfo(deviceInfoSet, deviceIndex, &deviceInfoData))
{
deviceInfoData.cbSize = sizeof(deviceInfoData);
ULONG IDSize;
CM_Get_Device_ID_Size(&IDSize, deviceInfoData.DevInst, 0);
TCHAR* deviceID = new TCHAR[IDSize];
CM_Get_Device_ID(deviceInfoData.DevInst, deviceID, MAX_PATH, 0);
if( deviceID[8]==vid.at(0) && deviceID[9]==vid.at(1) && deviceID[10]==vid.at(2) && deviceID[11]==vid.at(3) && //VID
deviceID[17]==pid.at(0) && deviceID[18]==pid.at(1) && deviceID[19]==pid.at(2) && deviceID[20]==pid.at(3)) //PID
{
//DWORD requiredBufferSize;
//SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &requiredBufferSize,
HDEVINFO deviceInterfaceSet = SetupDiGetClassDevs(&deviceInfoData.ClassGuid, NULL, NULL, DIGCF_ALLCLASSES);
DWORD deviceInterfaceIndex = 0;
deviceInterfaceData.cbSize = sizeof(deviceInterfaceData);
while(SetupDiEnumDeviceInterfaces(deviceInterfaceSet, NULL, &deviceInterfaceData.InterfaceClassGuid, deviceInterfaceIndex, &deviceInterfaceData))
{
deviceInterfaceData.cbSize = sizeof(deviceInterfaceData);
std::cout << deviceInterfaceIndex << std::endl;
deviceInterfaceIndex++;
}
//std::cout << deviceInterfaceData.cbSize << std::endl;
break;
}
deviceIndex++;
}
}
Meine SetupDiEnumDeviceInterfaces (in der GetDevice () - Funktion) ist nichts zu tun. Es ist noch nicht einmal betreten der while-Schleife... Kann das bitte mal jemand ausprobieren und herausfinden, was ich falsch mache bitte?
Dank
BEARBEITEN/WEITERE INFOS: ich habe gerade angerufen, der GetLastError () - Funktion und es hat wieder eine 259 - ERROR_NO_MORE_ITEMS. Ist es überhaupt möglich für ein Gerät enthalten, keine Schnittstellen?
SetupDiEnumDeviceInfo
ist false zurückgeben, dann. Schauen Sie in die Dokumentation um festzustellen, warum dies so sein kann und dann verwenden Sie Ihre debugger. Wenn Sie immer noch nicht herausfinden dann Fragen Sie eine weitere konkrete Frage, wo Sie stecken dann.Dann Darf ich Sie bitte Fragen, ob die deviceInfoData.ClassGuid übergeben wurden, richtig? Ich meine, ich bin suppost übergeben werden, die guid zu erhalten, die deviceInterfaceSet? Oder bin ich suppost zu übergeben es eine andere GUID?
Wenn Sie niemals in die while-Schleife dann werden Sie nie zu, dass die Linie des Codes, was bedeutet, Sie sind mit der
deviceInfoSet
zugewiesen wird, im Konstruktor. Hinweis: Verwenden Sie FormatMessage
mit GetLastError
zu bestimmen, was genau falsch gelaufen ist nach dem Aufruf SetupDiEnumDeviceInfo
Es könnte einfach sein, dass es keine Gegenwart aktiv USB-Geräte auf dem system verfügbar.zusammengestellt & ausführen von code ohne Probleme; zB:
DeviceManager::ListAllDevices
gibt für mich: 003796F8 00379800
~ich denke, Sie haben keine Geräte 😉 ~am besten bung in einen Scheck für den Rückgabewert beim Aufruf SetupDiGetClassDevs
Ich habe eine DeviceManager-Objekt und bezeichnet die ListAllDevices-Funktion und es erscheint eine Liste der USB-Geräte-IDs :S...
InformationsquelleAutor Danny | 2012-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben ein zu gehen mit diesem.
Ich habe versucht, hacken Sie Ihre original-code ungefähr so wenig wie möglich; die folgenden codes (für mich zumindest) bekommen durch die innere
while(SetupDiEnumDeviceInterfaces..)
:afaik, diese Methode nimmt die gleichen Geräte als mit Ihren OP-Konstruktor-Aufruf:
(NB: ich habe einige andere nützliche interface-guids)
aber ich mache dies, um das Gerät Schnittstellen:
ich habe auch die
deviceInfoData
zuSetupDiEnumDeviceInterfaces
da nach der Dokumentation:[Edit: zusätzliche Hinweise (; auf Anfrage 😉 ]
Ihr USB-Gerät hat eine zugeordnete setup Klasse und Schnittstelle Klasse(N):
Aus der Geräte-setup-Klassen Dokumentation:
Aus der device interface-Klassen Dokumentation:
Auch finden Sie in diesem handy Vergleich
Auch dies bezog sich doc ist nützlich
So:
dies ist das abrufen von allen setup Klasse Daten-sets und filtern auf "USB"
Sie könnte hierzu:
diese ruft die Klasse Daten-sets für Geräte mit Unterstützung für eine device interface von alle Klasse. (Die Anwendung eines emumerator ID N/a "USB" scheint keine Auswirkungen haben)
Entscheidend jedoch:
The function adds to the device information set a device information element that represents such a device and then adds to the device information element a device interface list that contains all the device interfaces that the device supports.
(Und Hinweis:
SP_DEVINFO_DATA.ClassGuid
ist immer wird die GUID des Geräts setup Klasse)Afaik:
aber Sie dann noch brauchen, um eine
InterfaceClassGuid
beim aufrufenSetupDiEnumDeviceInterfaces()
~tbh, ich weiß nicht wirklich verstehen, warum dies nötig wäre, wenn der Aufrufer ist die Bereitstellung der optional
DeviceInfoData
aber da es alles closed-source, wie würde ich das wissen !? 🙂
&Hier ist info über GUID_DEVINTERFACE_USB_DEVICE
(; disclaimer: ich arbeite nicht für M$; - behandeln Sie die oben genannten infos mit Argwohn 🙂 && natürlich dyoRs 😉
hoffe das hilft, viel Glück!
noP, siehe überarbeitete Antwort, btw, lol, ich bin *nicht viel XD
Ich wünschte, ich könnte Stimmen mehr als einmal. Sie müssen eine Menge Mühe in diese Antwort. Ich habe noch ein Stück von Informationen hinzufügen, nachdem Sie verprügelt, etwa für über einen Tag auf der Suche für Sie: Wenn Ihr Gerät einen WinUSB-Gerät, dann die GUID, die Sie passieren zu
SetupDiEnumDeviceInterfaces()
werden die "DeviceInterfaceGUIDs" - Wert aus der Registrierung/mit der inf-Datei. Ich sehr viel Zweifel, dies ist dokumentiert irgendwo.hob Ihre freundlichen Worte! biG thx 🙂
InformationsquelleAutor violet313
Das problem beginnt damit, wie SetupDiGetClassDevs genannt wird.
Wenn Sie suchen, um ein Gerät Pfad verwenden
SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE ,,,)
SetupDiEnumDeviceInterfaces schlägt fehl mit Fehler 259 wenn SetupDiGetClassDevs ist der falsche GUID in
ClassGuid die MS Hilfe sagt
Einen Zeiger auf die GUID für ein Gerät setup-Klasse oder ein Geräte-interface-Klasse.
Include-Datei devguid.h enthält eine Reihe von GUID_DEVCLASS Werte. Diese sind NICHT das gleiche wie GUID_DEVINTERFACE_* Werte, die sind, die Sie brauchen.
Verwenden: #include <uuids.h> die beinhaltet ksuuids.h wo finden Sie GUID_DEVINTERFACE_* - Werte.
Gibt es eine ausführliche Erklärung auf meiner website, mit einigen source-code, der helfen sollte, korrekt auflisten von USB-Geräten.
Sehen http://pixcl.com/SetupDiEnumInterfaces_Fail.htm
InformationsquelleAutor stewart DIBBS