Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SetupDiGetInterfaceDeviceDetail  (Прочитано 18287 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
oddy
Гость
« : 27-06-2003 20:32 » new

Помогите новечку, люди добрые!
Пытаюсь получить имя устройства для createfile.
Посылаю GUID  из описания драйвера, вроде все правильно, но Жаль
получаю строку "\" .  
Пишу на Delphi...
 
hardwareDeviceInfo:= SetupDiGetClassDevs (
                           GUID,
              nil,
                           0,
                           (DIGCF_PRESENT or  DIGCF_DEVICEINTERFACE));
      deviceInfoData^.cbSize := sizeof (TSPInterfaceDeviceData);
 
 if SetupDiEnumDeviceInterfaces(hardwareDeviceInfo,nil,GUID^,0,deviceInfoData^)
    then
     begin
     SetupDiGetInterfaceDeviceDetail(
               HardwareDeviceInfo,
               DeviceInfoData,
               nil,
               0,
               requiredlength,
               nil);

      if getlasterror=122 then showmessage('Пять минут - полет нормальный!') else showmessage(inttostr(GetLastError));
     До этого момента все ок!
      predictedLength:=Requiredlength^;
      getmem(functionClassDeviceData,predictedlength);
functionClassDeviceData^.cbSize:= sizeof  (TSPDEVICEINTERFACEDETAILDATA);

      if (SetupDiGetInterfaceDeviceDetail(
               HardwareDeviceInfo,
               DeviceInfoData,
               functionclassdevicedata,
               predictedLength,
               requiredLength,
               nil)) then showmessage('Усе идет по плану');

     outNameBuf:=functionClassDeviceData^.devicepath;
     Пытаюсь достучаться до девайса под именем  outNameBuf
И здесь оно выдает мне стоку "\"
  Ха-ха-ха Что я делаю не правильно :?:
Записан
axel
Гость
« Ответ #1 : 27-06-2003 22:18 » 

Привет, oddy, в моем случае это выглядело так:

   HidD_GetHidGuid(&HidGuid);   
    :!: Тут я получаю GUID
   /*
   API function: SetupDiGetClassDevs
   Returns: a handle to a device information set for all installed devices.
   Requires: the GUID returned by GetHidGuid.
   */
    :!: Тут получаю Info, кстати заметил разницу между своим кодом и твоим может быть дельфи плохо типы блюдут, да и ты не указал тип своего GUID'а. в первом случае у тебя употребляется просто GUID
hardwareDeviceInfo:= SetupDiGetClassDevs (
 :!: GUID,
nil,
0,
(DIGCF_PRESENT or DIGCF_DEVICEINTERFACE));
а во втором он с крышечкой
if SetupDiEnumDeviceInterfaces(hardwareDeviceInfo,nil,GUID^,0,deviceInfoData^)
помоему апишные функции требуют указатель (у меня  &HidGuid)
 :!: конец первого комментария


   hDevInfo=SetupDiGetClassDevs
      (&HidGuid, NULL, NULL, DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
      
   devInfoData.cbSize = sizeof(devInfoData);

   //Step through the available devices looking for the one we want.
   //Quit on detecting the desired device or checking all available devices without success.
   MemberIndex = 0;
   LastDevice = FALSE;

   do
   {
      MyDeviceDetected=FALSE;
      
      /*
      API function: SetupDiEnumDeviceInterfaces
      On return, MyDeviceInterfaceData contains the handle to a
      SP_DEVICE_INTERFACE_DATA structure for a detected device.
      Requires:
      The DeviceInfoSet returned in SetupDiGetClassDevs.
      The HidGuid returned in GetHidGuid.
      An index to specify a device.
      */
 :
      Result=SetupDiEnumDeviceInterfaces (hDevInfo, 0, &HidGuid, MemberIndex, &devInfoData);

      if (Result != 0)
      {
         //A device has been detected, so get more information about it.

         /*
         API function: SetupDiGetDeviceInterfaceDetail
         Returns: an SP_DEVICE_INTERFACE_DETAIL_DATA structure
         containing information about a device.
         To retrieve the information, call this function twice.
         The first time returns the size of the structure in Length.
         The second time returns a pointer to the data in DeviceInfoSet.
         Requires:
         A DeviceInfoSet returned by SetupDiGetClassDevs
         The SP_DEVICE_INTERFACE_DATA structure returned by SetupDiEnumDeviceInterfaces.
         
         The final parameter is an optional pointer to an SP_DEV_INFO_DATA structure.
         This application doesn't retrieve or use the structure.         
         If retrieving the structure, set
         MyDeviceInfoData.cbSize = length of MyDeviceInfoData.
         and pass the structure's address.
         */
         
         //Get the Length value.
         //The call will return with a "buffer too small" error which can be ignored.
         Result = SetupDiGetDeviceInterfaceDetail
            (hDevInfo, &devInfoData, NULL, 0, &Length, NULL);

         //Allocate memory for the hDevInfo structure, using the returned Length.
         detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
         
         //Set cbSize in the detailData structure.
         detailData -> cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

         //Call the function again, this time passing it the returned buffer size.
         Result = SetupDiGetDeviceInterfaceDetail
            (hDevInfo, &devInfoData, detailData, Length, &Required, NULL);

         //Open a handle to the device.

         /*
         API function: CreateFile
         Returns: a handle that enables reading and writing to the device.
         Requires:
         The DevicePath in the detailData structure
         returned by SetupDiGetDeviceInterfaceDetail.
         */

         DeviceHandle=CreateFile
            (detailData->DevicePath,
            GENERIC_READ|GENERIC_WRITE,
            FILE_SHARE_READ|FILE_SHARE_WRITE,
            NULL,
            OPEN_EXISTING,
            0,
            NULL);


 :!: Надеюсь английские комментарии и С не очень смущают и дадут какой то полезный результат  Ага
Записан
oddy
Гость
« Ответ #2 : 28-06-2003 03:16 » 

Большое спасибо!
 Отлично Дело, по ходу,  действительно в типе.
В первом случае у меня GUID имеет тип указателя PGUID : ^ TGUID, а во втором - структуру TGUID, хотя все компилилось.
Бага, как оказалось, закралась в определении external функции из SetupApi,
там у меня было TGUID. Глянул в setupapi.h -  а там LPGID  :?
- вообще не представляю как оно еще что-то делало.  Я шокирован!
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 28-06-2003 03:19 » 

Заходи еще  Отлично
Записан

А птичку нашу прошу не обижать!!!
oddy
Гость
« Ответ #4 : 14-07-2003 14:33 » 

Люди! Помогите мне, пожалуйста! Кажется я совсем глюкнулся!
  Вот такой я вот Берем функцию:
SetupDiGetInterfaceDeviceDetail (
               HDevInfo,
               DevInfoData,
               functionClassDevData,
               predicted,
               &required,
               NULL);
получаем:
devicename = functionClassDeviceData->DevicePath
где:
PSP_DEVICE_INTERFACE_DETAIL_DATA_A  functionClassDeviceData;

в setupapi эта функция определена как:
 
******setupapi.h******

typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A {
    DWORD  cbSize;
    CHAR   DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A;

где ANYSIZE_ARRAY в winnt.h является единицей!

******Winnt.h*******

#define ANYSIZE_ARRAY 1    Я шокирован!

каким образом мы получаем строку в devicename Не понял?!!!
 :?:
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 14-07-2003 17:07 » 

Я думаю есть нормальное опрделение, априори компилятор так не ошибается, он находит правильные значения, скорее всего данные не читаются из тех хидеров где ты смотришь.
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 15-07-2003 05:15 » 

Цитата: oddy

 
******setupapi.h******

typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A {
    DWORD  cbSize;
    CHAR   DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A;

где ANYSIZE_ARRAY в winnt.h является единицей!

******Winnt.h*******

#define ANYSIZE_ARRAY 1    Я шокирован!

каким образом мы получаем строку в devicename Не понял?!!!
 :?:


Это стандартный способ возвращения данных, размер которых неизвестен на момент вызова - это header возвращенных данных, то есть DevicePath[0]- первая буква, за ней DevicePath[1] вторая- и так далее, размер всего имени в переменной  cbSize.
 Также передаются сообщения в UNIX там в определении тела сообщения для данных только один байт отведен, но прийти их может больше.
 То есть начало полученных данных имеет вид этой структуры- сначала размер, потом само имя.
Записан
O d d y
Гость
« Ответ #7 : 16-07-2003 10:54 » 

Выходит, что так.
 :? А вот в Делфи devicepath принять способом devicename = functionClassDeviceData^.DevicePath (как в С++ ) не получается, так как возвращается только первый символ. А вот если сделать именно DevicePath[0] + DevicePath[1] + ... , то получаем полное имя.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #8 : 16-07-2003 11:19 » 

Одди - почему без пароля??? Забыл - попроси его у форума...есть же в логине такая вещь.
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #9 : 16-07-2003 11:24 » 

Цитата: O d d y
Выходит, что так.
 :? А вот в Делфи devicepath принять способом devicename = functionClassDeviceData^.DevicePath (как в С++ ) не получается, так как возвращается только первый символ. А вот если сделать именно DevicePath[0] + DevicePath[1] + ... , то получаем полное имя.


 Если это так- то это проблемы исключительно компилятора или run time библиотеки Delphi. На С/C++ такого нет.
Записан
dimonbest
Гость
« Ответ #10 : 29-07-2009 11:52 » 

Большое спасибо!
 Отлично Дело, по ходу,  действительно в типе.
В первом случае у меня GUID имеет тип указателя PGUID : ^ TGUID, а во втором - структуру TGUID, хотя все компилилось.
Бага, как оказалось, закралась в определении external функции из SetupApi,
там у меня было TGUID. Глянул в setupapi.h -  а там LPGID  :?
- вообще не представляю как оно еще что-то делало.  Я шокирован!
Так что Вы все таки в результате изменили, что стал отображаться правильный путь?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines