реклама на сайте
подробности

 
 
> Получить имя устройства USB
Timofey
сообщение Jul 25 2009, 19:06
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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, но её нет в библиотеке винды sad.gif

Сообщение отредактировал Timofey - Jul 25 2009, 19:12
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Timofey
сообщение Jul 26 2009, 08:28
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Цитата(alexkok @ Jul 26 2009, 12:53) *


Спасибо за код. Но что то у меня также он не выводит ни одного устройства. А какой GUID вы передаете этой функции?
У меня остались подозрения, что либо я передаю не тот GUID, либо .... пока незнаю что еще ...

Цитата(Xenia @ Jul 26 2009, 13:16) *


Писал сначала в вижуал студии 2005, ибо просили на шарпе программу сделать. Но потом тихо переполз на делфи 7.
Да и понять надо, почему же если работаю напрямую с библиотекой, не работает эта функция laughing.gif
Go to the top of the page
 
+Quote Post
alexkok
сообщение Jul 26 2009, 18:13
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 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';


--------------------
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 03:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016