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

Schreibe einen Kommentar