|
Получить имя устройства USB |
|
|
|
Jul 25 2009, 19:06
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
Есть USB устройство. Подключаю его к компу. Драйвер ставится, все хорошо. Устройство видно в диспетчере. У него есть один интерфейс с тремя точками (кроме нулевой): 1 - от хоста в устройство (2 байта длиной), 4 и 5 - от устройства к хосту (256 байт длиной). Пишу следующие строки Код HDEVINFO hDevInfo; PSP_DEVICE_INTERFACE_DATA pDevInfoData = NULL; PSP_DEVICE_INTERFACE_DETAIL_DATA pDevInfoDetail = NULL; ULONG nNameLen;
Driver = INVALID_HANDLE_VALUE; hDevInfo = SetupDiGetClassDevsA((GUID*)&GUID_USBSRV_TYPE_DEVICE,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE); pDevInfoData = new SP_DEVICE_INTERFACE_DATA; pDevInfoData->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); if (SetupDiEnumDeviceInterfaces(hDevInfo,NULL,(GUID*)&GUID_USBSRV_TYPE_DEVICE,0,pDevInfoData)) { SetupDiGetInterfaceDeviceDetail(hDevInfo,pDevInfoData,NULL,0,&nNameLen,NULL); pDevInfoDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA) new unsigned char[nNameLen]; pDevInfoDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); SetupDiGetInterfaceDeviceDetailA(hDevInfo,pDevInfoData,pDevInfoDetail,nNameLen,&nNameLen,NULL); Driver = CreateFile(pDevInfoDetail->DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPE N_EXISTING,0,0); } delete pDevInfoData; delete[] pDevInfoDetail; GUID_USBSRV_TYPE_DEVICE= (D1: $36FC9E60; D2: $C465; D3: $11CF; D4: ($80, $56, $44, $45, $53, $54, $00, $00)); Проблема в том, что функция SetupDiEnumDeviceInterfaces всегда возвращает мне ошибку, что интерфейсов не найдено. Я даже перебрал остальные GUID ради интереса, которые нашел в реестре. В чем может быть причина? Или может есть другие способы получения имени и открытия устройства как файла? З.Ы. Выравнивания в программе отключено для структур. З.Ы.Ы. И еще, чем отличаются функции SetupDiGetClassDevsA от SetupDiGetClassDevsW? В мсдн вобще про них ничего не нашел, есть просто SetupDiGetClassDevs, но её нет в библиотеке винды
Сообщение отредактировал Timofey - Jul 25 2009, 19:12
|
|
|
|
|
 |
Ответов
|
Jul 26 2009, 08:28
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
Цитата(alexkok @ Jul 26 2009, 12:53)  Спасибо за код. Но что то у меня также он не выводит ни одного устройства. А какой GUID вы передаете этой функции? У меня остались подозрения, что либо я передаю не тот GUID, либо .... пока незнаю что еще ... Цитата(Xenia @ Jul 26 2009, 13:16)  Писал сначала в вижуал студии 2005, ибо просили на шарпе программу сделать. Но потом тихо переполз на делфи 7. Да и понять надо, почему же если работаю напрямую с библиотекой, не работает эта функция
|
|
|
|
|
Jul 26 2009, 18:13
|
Знающий
   
Группа: Участник
Сообщений: 609
Регистрация: 3-03-07
Из: San Jose
Пользователь №: 25 837

|
Цитата(Timofey @ Jul 26 2009, 12:28)  Но что то у меня также он не выводит ни одного устройства. А какой GUID вы передаете этой функции? //guid for FX2LP w/o EEPROM 04b4 8613 CYUSBDRV_GUID: TGUID = '{AE18AA60-7F6A-11D4-97DD-00010229B959}'; Цитата У меня остались подозрения, что либо я передаю не тот GUID, либо .... пока незнаю что еще ... У меня тоже были проблемы, но уже не помню конкретно. Вызовы апишных функций я переопределил. Код function SetupDiGetClassDevs( ClassGuid: PGUID; Enumerator: pchar; hwndParent: HWND; Flags: cardinal ): HDEVINFO; stdcall; external 'setupapi.dll' name 'SetupDiGetClassDevsA';
function SetupDiEnumDeviceInfo( DeviceInfoSet: HDEVINFO; MemberIndex: cardinal; var DeviceInfoData: TSPDevInfoData ): LongBool stdcall; external 'setupapi.dll' name 'SetupDiEnumDeviceInfo';
function SetupDiEnumDeviceInterfaces( DeviceInfoSet: HDEVINFO; PDeviceInfoData: PSP_DEVINFO_DATA; InterfaceClassGuid: PGUID; MemberIndex: cardinal; var DeviceInterfaceData: TSPDeviceInterfaceData ): LongBool stdcall; external 'setupapi.dll' name 'SetupDiEnumDeviceInterfaces';
function SetupDiGetDeviceInterfaceDetail( DeviceInfoSet: HDEVINFO; DeviceInterfaceData: PSP_DEVICE_INTERFACE_DATA; pDeviceInterfaceDetailData: PSP_DEVICE_INTERFACE_DETAIL_DATA; //OPTIONAL DeviceInterfaceDetailDataSize: cardinal; var RequiredSize: cardinal; //OPTIONAL pDeviceInfoData: PSP_DEVINFO_DATA //OPTIONAL ): LongBool stdcall; external 'setupapi.dll' name 'SetupDiGetDeviceInterfaceDetailA';
function SetupDiDestroyDeviceInfoList( DeviceInfoSet: HDEVINFO ): LongBool stdcall; external 'setupapi.dll' name 'SetupDiDestroyDeviceInfoList';
function DeviceIoControl( hDevice :cardinal; dwIoControlCode :cardinal; lpInBuffer :pointer; InBufferSize :cardinal; lpOutBuffer :pointer; OutBufferSize :cardinal; //var BytesReturned :cardinal; lpBytesReturned :pointer; lpOverlapped :POverlapped ): LongBool stdcall; external kernel32 name 'DeviceIoControl';
function GetOverlappedResult( hDevice :cardinal; lpOverlapped :POverlapped; var NumberOfBytesTransferred :cardinal; bWait :LongBool ): LongBool stdcall; external kernel32 name 'GetOverlappedResult';
--------------------
|
|
|
|
|
May 4 2010, 05:00
|
Группа: Новичок
Сообщений: 1
Регистрация: 4-05-10
Пользователь №: 57 046

|
> GUID_USBSRV_TYPE_DEVICE= (D1: $36FC9E60; D2: $C465; D3: $11CF; D4: ($80, $56, $44, $45, $53, $54, $00, $00)); > Проблема в том, что функция SetupDiEnumDeviceInterfaces всегда возвращает мне ошибку, что интерфейсов не найдено. Попробуй GUID_USBSRV_TYPE_DEVICE = "A5DCBF10-6530-11D2-901F-00C04FB951ED" Вот код который подсчитывает количество активных (DIGCF_PRESENT) интерфейсов (DIGCF_DEVICEINTERFACE): Код HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
struct __declspec(uuid("A5DCBF10-6530-11D2-901F-00C04FB951ED")) uuidUsbDevClass { }; GUID GUID_USB = __uuidof(uuidUsbDevClass);
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); ZeroMemory(&DeviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA)); DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); DeviceInfoData.ClassGuid = __uuidof(uuidUsbDevClass); hDevInfo = SetupDiGetClassDevs(&DeviceInfoData.ClassGuid, 0,0,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE );
if (hDevInfo == INVALID_HANDLE_VALUE) { // Insert error handling here. printf("Invalid handle\n"); return 1; } BOOL bRet = FALSE; DWORD dwIndex = 0; char szTraceBuf[256]; while(TRUE) { bRet = SetupDiEnumDeviceInterfaces( hDevInfo, NULL, &DeviceInfoData.ClassGuid, dwIndex, &DeviceInterfaceData ); if (!bRet) { sprintf(szTraceBuf, "SetupDiEnumDeviceInterfaces failed " \ "GetLastError() returns: 0x%x\n", GetLastError()); //OutputDebugString(szTraceBuf); printf("SetupDiEnumDeviceInterfaces failed " \ "GetLastError() returns: 0x%x\n", GetLastError());
if (GetLastError() == ERROR_NO_MORE_ITEMS) { break; } } dwIndex++; } больше можно найти здесь http://www.codeguru.com/forum/archive/inde...p/t-331907.html
Сообщение отредактировал rezident - May 11 2010, 23:18
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
May 20 2010, 08:36
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(liebvit @ May 4 2010, 09:00)  hDevInfo = SetupDiGetClassDevs(&DeviceInfoData.ClassGuid, 0,0,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE ); А у меня, если так пишу (вместе с флагом DIGCF_DEVICEINTERFACE), то натуральные COM-порты находит, а виртуальные (порождаемые USB-устрйоством) не видит. Но как только флаг DIGCF_DEVICEINTERFACE убираешь (оставляя только один DIGCF_PRESENT), то находит виртульные COM-порты от USB-устройств, но не видит COM-портов натуральных. Такая вот странность...
|
|
|
|
Сообщений в этой теме
Timofey Получить имя устройства USB Jul 25 2009, 19:06 Xenia Цитата(Timofey @ Jul 25 2009, 22:06) И ещ... Jul 25 2009, 19:48 Timofey Спасибо большое.
Я натыкался уже на такой пост.
Я ... Jul 26 2009, 05:12 alexkok Цитата(Timofey @ Jul 26 2009, 08:12) Да и... Jul 26 2009, 06:53 Xenia Цитата(Timofey @ Jul 26 2009, 08:12) //по... Jul 26 2009, 07:16 Timofey hDevInfoSet:=SetupDiGetClassDevsA(@GUID_DEVCLASS,@... Jul 26 2009, 14:40 aag какую древнюю тему подняли)) уже почти год прошел May 11 2010, 05:33 alevnew Цитата(aag @ May 11 2010, 10:33) какую др... May 20 2010, 07:32
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|