Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.03.2012, 17:48
loltrol loltrol вне форума
Прохожий
 
Регистрация: 22.03.2012
Сообщения: 2
Репутация: 10
По умолчанию CreateFile Delphi 2010 (USB)

Добрый день!
Никак не могу понять в чём проблема, один и тот же код работает на Delphi 5 и не работает на Delphi 2010. Код перебирает подключённые HID-устройства и находит нужное.
Код:
  lcHDevInfo:=SetupDiGetClassDevs(@C_GUID_CLASS_USB_DEVICE, nil, 0, DIGCF_PRESENT OR DIGCF_DEVICEINTERFACE);
  if lcHDevInfo=Pointer(INVALID_HANDLE_VALUE) then Exit;

  try
    i:=0;
    lcDevInfoData.cbSize:=SizeOf(TSPDevInfoData);
    lcDevInterfData.cbSize:=SizeOf(TSPDeviceInterfaceData);
    while SetupDiEnumInterfaceDevice(lcHDevInfo, nil, C_GUID_CLASS_USB_DEVICE, i, lcDevInterfData) do
    try
      lcSize:=0;
      SetupDiGetDeviceInterfaceDetail(lcHDevInfo, @lcDevInterfData, nil, 0, lcSize, nil);
      if lcSize=0 then Continue;

      try
        GetMem(lcDevInterfDetailData, lcSize);
        lcDevInterfDetailData.cbSize:=SizeOf(TSPDeviceInterfaceDetailData);
        if not SetupDiGetDeviceInterfaceDetail(lcHDevInfo, @lcDevInterfData, lcDevInterfDetailData, lcSize, lcSize, @lcDevInfoData) then Continue;
        lcDevPath:=lcDevInterfDetailData.DevicePath;

        lcHandle:=CreateFile(lcDevPath, GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
        if lcHandle=INVALID_HANDLE_VALUE then Continue;
        try
          lcAttributes.Size:=SizeOf(THidDAttributes);
          if not HidD_GetAttributes(lcHandle, lcAttributes) then Continue;
          if (lcAttributes.VendorID<>C_MY_VID) then Continue;

          //дальнейшие вычитывания
        finally
          CloseHandle(lcHandle);
        end;
      finally
        FreeMem(lcDevInterfDetailData);
      end;
    finally
      Inc(i);
    end;
  finally
    SetupDiDestroyDeviceInfoList(lcHDevInfo);
  end;
В Delphi 2010 просто не проходит CreateFile (GetLastError выдаёт 31). На том же компьютере под Delphi 5 всё работает как часы. Система Windows 7.
Кто-нибудь сталкивался?
Ответить с цитированием
  #2  
Старый 22.03.2012, 18:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тип lcDevPath какой?
Не забываем, что D2010 вся из себя такая юникодная...
Ответить с цитированием
  #3  
Старый 23.03.2012, 09:32
loltrol loltrol вне форума
Прохожий
 
Регистрация: 22.03.2012
Сообщения: 2
Репутация: 10
По умолчанию

lcDevPath PChar
Разобрался, в чём дело. Из-за C_GUID_CLASS_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}'; функция SetupDiGetDeviceInterfaceDetail возвращала неполный путь к устройству. Проблема ушла с HidD_GetHidGuid, которая возвращает другой GUID.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:45.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025