Zugriff auf USB Geräte



  • Hallo,

    ich habe einen Rechner, an den 4 gleiche Kameras (Canon 1000d) angeschlossen werden.
    Alle vier werden vom PC (Win 7) als USB Gerät erkannt (Computer\\EOS 1000d - das Gleiche 4 mal). Das Problem ist, dass alle Kameras den gleichen Namen bekommen und ich somit keinen absoluten Pfad zu jeder Kamera bekomme. Diesen benötige ich aber.

    Gibt es eine Möglichkeit auf die Kameras separat zuzugreifen?

    Danke!



  • Was hat das mit MFC zu tun?



  • Ich will die Geräte in C++ auslesen. Wenn notwendig mit MFC, da mir nicht klar ist, wie es anders gehen soll



  • Man kann sich die USB-Geräte ausgeben lassen und die Seriennummern abfragen. Das ist kein Problem. DAfür gibts einige Beispiele. Es gab dazu mal einen Beitrag hier. Musste mal nach HID oder USB suchen.



  • Hallo,

    kannst ich kann den Beitrag leider nicht finden. Wi egenau erfrage ich die ID denn?
    Ich finde einfach keine Lösung
    Grüße



  • Schau mal nach

    DeviceIoControl()

    Ich nutze hauptsächlich HID-Geräte was nur Eingebegeräte versteht. Da sind das diese Funktionen:

    HidD_GetSerialNumberString
    HidD_GetManufacturerString
    HidD_GetProductString

    Allerdings keine ahnung wie deine Kamera da gehandhabt wird. Versuch erstmal das DeviceIoControll().



  • Vielen Dank schonmal für die Infos,

    ich benötige das auch nur für Eingabegeräte(Tatstatur, Maus usw.)

    Brauche ich dafür die Datei hidsdi.h?
    Wo finde ich diese? Ich benutze Dev-C++ darin enthalten ist auch das ddk, allerdings fehlt hier die Header Datei auch im WDK kann ich sie nicht finden.

    Gruß
    Torwald



  • dafür brauchst du die

    hidsdi.h
    hidpi.h
    hidusage.h
    hid.lib

    Google mal nach, die kann man sicher irgendwo runterladen. Aber die sollen im DDK eigentlich drin sein. Sind sie bei mir jedenfalls im Windows DDK



  • Hallo,

    so ich hab jetzt alle benötigten Headerdatein und auch die hid.lib.

    JEtzt die Frage wie füge ich denn die hid.lib dem Projekt zu?

    Und wie genau benutze ich zB "HidD_GetSerialNumberString"?

    Diese Funktion gibt mir nur einen Bool-Wert zurück, was muss ich tun damit ich einen String erhalte?



  • Na die LIB musst du deinen Linkeroptionen als zusätzliches Elemnt angeben oder
    so:

    extern "C" { 
    #include "hidsdi.h" 
    #include "setupapi.h"
    }
    
    #pragma comment(lib,"hid.lib")
    #pragma comment(lib,"setupapi.lib")
    

    Ach ja evtl. nbrauchst du auch die setupapi.lib und .h ...
    Und für die Seriennummer brauchst du ein gültiges Handle zu deinem USB-Gerät.

    Hier mal funktionen die ich verwende um an die USB-Daten zu kommen.

    CString GetSerialNumber(HANDLE handle)
    {
    	WCHAR sn[32];
    	CString	serial;
    
    	memset(&sn, 0, 32);
    	HidD_GetSerialNumberString(handle, &sn, 32); 
    
    	serial.Format(_T("%s"), &sn[0]);
    	return serial;
    }
    
    int EnumHidDevices(CString devSerial[32])
    {
    	HIDD_ATTRIBUTES						Attributes;
    	SP_DEVICE_INTERFACE_DATA			devInfoData;
    	PSP_DEVICE_INTERFACE_DETAIL_DATA	detailData;
    	HDEVINFO							hDevInfo;
    	int									MemberIndex = 0;
    	LONG								DevInfo;
    	ULONG								Length = 0;
    	ULONG								Required;
    	GUID								HidGuid;
    	HANDLE								devHandle;
    	CString								serial;
    	int									counter = 0;
    
        ZeroMemory(&devInfoData, sizeof(devInfoData));
        devInfoData.cbSize = sizeof(devInfoData);
    
    	HidD_GetHidGuid(&HidGuid);	
    
    	hDevInfo = SetupDiGetClassDevsW(&HidGuid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
    
    	do{
    		DevInfo = SetupDiEnumDeviceInterfaces (hDevInfo, NULL, &HidGuid, MemberIndex, &devInfoData);
    
    		if (DevInfo != 0)
    		{
    			SetupDiGetDeviceInterfaceDetailW(hDevInfo, &devInfoData, NULL, 0, &Length, NULL);
    
    			detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(Length);
    			detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
    
    			SetupDiGetDeviceInterfaceDetailW(hDevInfo, &devInfoData, detailData, Length, &Required, NULL);
    
    			devHandle = CreateFileW(detailData->DevicePath, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);
                            //Atributes enthält die VendorID und ProductID und andere evtl. relevante Daten
    			//Attributes.Size = sizeof(Attributes);
    			//HidD_GetAttributes (devHandle, &Attributes);
    
    				/*Generate list of serials*/
    				/*****************************************************************************/
    				serial.SetString(GetSerialNumber(devHandle));
    
    				devSerial[MemberIndex].SetString(serial);
    
    				/*****************************************************************************/
    
    		CloseHandle(devHandle);
    
    		free(detailData);
    		}
    
    		MemberIndex++;
    
    	}while (DevInfo != NULL);
    
    	SetupDiDestroyDeviceInfoList(hDevInfo);
    
    	return 0;
    }
    

    Musst mal schaun ob du damit klar kommst. Ich hab etwas drin rumgekürzt aber es sollte dir alle Seriennummern von ALLEN angeshlossenen USB-Geräten liefern. mit Attributes kannst du das mittels if und der VendorID auf deine Kameras eingrenzen.



  • Vielen Dank dafür, das hat mir schon ein wenig geholfen.

    Allerdings weiß ich wei gesagt leider noch nicht annähernd wie C++ funktioniert, ich brauch das ganze nur zu testzwecken.

    Unten ist das Programm, welches natürlich noch nicht funktioniert.
    Was fehlt, bzw was hab ich falsch gemacht?

    Müssen die Methoden wie in Java in eine Klasse?

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    #include <winable.h>
    #include <stdio.h>
    #include <hidclass.h>
    #include <setupapi.h>
    #include <hidsdi.h>
    #include <ddk/hidpi.h>
    #include <ddk/hidusage.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
        //GetRawInputDeviceList;
    
        // Tatstatur und Maus ausschalten!!!
        //bool ret;
       // ret = BlockInput( TRUE ); 
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    CString GetSerialNumber(HANDLE handle)
    {
        WCHAR sn[32];
        CString    serial;
    
        memset(&sn, 0, 32);
        HidD_GetSerialNumberString(handle, &sn, 32);
    
        serial.Format(_T("%s"), &sn[0]);
        return serial;
    }
    
    int EnumHidDevices(CString devSerial[32])
    {
        HIDD_ATTRIBUTES                        Attributes;
        SP_DEVICE_INTERFACE_DATA            devInfoData;
        PSP_DEVICE_INTERFACE_DETAIL_DATA    detailData;
        HDEVINFO                            hDevInfo;
        int                                    MemberIndex = 0;
        LONG                                DevInfo;
        ULONG                                Length = 0;
        ULONG                                Required;
        GUID                                HidGuid;
        HANDLE                                devHandle;
        CString                                serial;
        int                                    counter = 0;
    
        ZeroMemory(&devInfoData, sizeof(devInfoData));
        devInfoData.cbSize = sizeof(devInfoData);
    
        HidD_GetHidGuid(&HidGuid);   
    
        hDevInfo = SetupDiGetClassDevsW(&HidGuid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
    
        do{
            DevInfo = SetupDiEnumDeviceInterfaces (hDevInfo, NULL, &HidGuid, MemberIndex, &devInfoData);
    
            if (DevInfo != 0)
            {
                SetupDiGetDeviceInterfaceDetailW(hDevInfo, &devInfoData, NULL, 0, &Length, NULL);
    
                detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(Length);
                detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
    
                SetupDiGetDeviceInterfaceDetailW(hDevInfo, &devInfoData, detailData, Length, &Required, NULL);
    
                devHandle = CreateFileW(detailData->DevicePath, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);
                            //Atributes enthält die VendorID und ProductID und andere evtl. relevante Daten
                //Attributes.Size = sizeof(Attributes);
                //HidD_GetAttributes (devHandle, &Attributes);
    
                    /*Generate list of serials*/
                    /*****************************************************************************/
                    serial.SetString(GetSerialNumber(devHandle));
    
                    devSerial[MemberIndex].SetString(serial);
    
                    /*****************************************************************************/
    
            CloseHandle(devHandle);
    
            free(detailData);
            }
    
            MemberIndex++;
    
        }while (DevInfo != NULL);
    
        SetupDiDestroyDeviceInfoList(hDevInfo);
    
        return 0;
    }
    

Anmelden zum Antworten