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_GetProductStringAllerdings 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.libGoogle 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; }