Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 27.02.2009, 10:01   #1
Koluna
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 18
По умолчанию Работа с устройствами, JEDI API

Здравствуйте!

Требуется программно отключить, а потом подключить USB-устройство (FT245R) подобно пунктам меню Диспетчера устройств "Отключить" и "Задействовать".
Как это проще всего сделать?

Как я понял надо использовать SetupApi.
Скачал его. Но как понял - не полностью (scapi_current.zip, win32api_current.zip)...
При компиляции выдаётся ошибка [Fatal Error] SetupApi.pas(57): File not found: 'ModuleLoader.dcu'.
Где взять этот файл?

Пока даже подключить библиотеку не удалось, я уже не говорю о программировании

Спасибо заранее!
Koluna вне форума Ответить с цитированием
Старый 27.02.2009, 10:59   #2
Koluna
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 18
По умолчанию

Всего у меня скачано:
scapi_current.zip
win32api_current.zip
jedi_api22a_jwscl092a.zip
ntapi_current.zip

Хм... после скачки огромного jedi_api22a_jwscl092a.zip и прописи путей к папкам Common, SaCMAPI, Win32API компиляция прошла успешно!
Видимо, надо было сразу качать этот файл.

Далее.
Есть ли какие-нибудь тонкости установки данного пакета? Компиляции его?

Сейчас будем пробовать функции вызывать

Пробуем вызывать функции...
Код:

...

var
  Guid : TGUID;
  PnPHandle : HDevInfo;

...

const
  USBGuid : TGUID = '{36FC9E60-C465-11CF-8056-444553540000}';

...

  Guid := USBGuid;
  PnPHandle := SetupDiGetClassDevs(@Guid, nil, 0, DIGCF_PRESENT);

...
При вызове SetupDiGetClassDevs получаем: 'Access Violation at address 00000000. Read of address 0000000.'

С чем это связано?
Что-то с компиляцией модулей?

Последний раз редактировалось rpy3uH; 27.02.2009 в 12:51.
Koluna вне форума Ответить с цитированием
Старый 27.02.2009, 12:52   #3
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

прочитай вот эту статью и будет тебе счатье.

Последний раз редактировалось rpy3uH; 27.02.2009 в 19:59.
rpy3uH вне форума Ответить с цитированием
Старый 27.02.2009, 19:04   #4
Koluna
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 18
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
прочитай вот эту статью и юудет тебе счатье.
Спасибо!
С первого взгляда полезная статья!
Будем читать
Koluna вне форума Ответить с цитированием
Старый 02.03.2009, 12:05   #5
Koluna
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 18
По умолчанию

Спасибо большое за статью!
Ценная статья!
Разбираемся, пробуем.

Возникло несколько вопросов.
1. При компиляции возникает ошибка:
Код:
...
  DeviceInfoSet_ := SetupDiGetClassDevs(@ClassGUID, nil, 0, DIGCF_PRESENT);
  if DeviceInfoSet_ = INVALID_HANDLE_VALUE then
  begin
...
[Error] Unit1.pas(152): Operator not applicable to this operand type

Приходится делать Integer(DeviceInfoSet_).

Понятное дело, указатель и целое число...
Почему в статье нет приведения типа?

2. При вызове SetupDiEnumDeviceInfo с параметром SPDRP_FRIENDLYNAME функция возвращает ERROR_INVALID_DATA (уточнял в MSDN). Пробовал для USB, Video, HID - везде такой результат. Почему? Неужели у устройств данных классов нету таких свойств?

3. Как лучше (проще) осуществить поиск конкретного устройства (считаем, что к компьютеру подключено несколько одинаковых устройств FTDI с разными Description и Serial Number? Т. е., нужно заполнить структуры, необходимые для включения и отключения устройства, не перебирая все устройства... Видимо, как-то по GUID устройства (см. п. 4).

4. Как можно узнать GUID (PnP идентификатор, физическое имя устройства в Windows) конкретного устройства для работы с ним? Имеется ввиду не с помощью своего приложения, а как-нибудь средствами Windows.

5. Из чего состоит и как формируется GUID устройства?

6. Как осуществляется привязка GUID к устройству? Т. е., если я буду подключать устройство к разным ПК, то GUID устройства всегда будет разный или всегда одинаковый?

Последний раз редактировалось Koluna; 02.03.2009 в 12:14.
Koluna вне форума Ответить с цитированием
Старый 02.03.2009, 12:22   #6
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

Цитата:
Сообщение от Koluna Посмотреть сообщение
Возникло несколько вопросов.
1. При компиляции возникает ошибка:
на Delphi 7.2 всё нормально

Цитата:
Сообщение от Koluna Посмотреть сообщение
3. Как лучше (проще) осуществить поиск конкретного устройства (считаем, что к компьютеру подключено несколько одинаковых устройств FTDI с разными Description и Serial Number? Т. е., нужно заполнить структуры, необходимые для включения и отключения устройства, не перебирая все устройства... Видимо, как-то по GUID устройства (см. п. 4).

4. Как можно узнать GUID (PnP идентификатор, физическое имя устройства в Windows) конкретного устройства для работы с ним? Имеется ввиду не с помощью своего приложения, а как-нибудь средствами Windows.

5. Из чего состоит и как формируется GUID устройства?

6. Как осуществляется привязка GUID к устройству? Т. е., если я буду подключать устройство к разным ПК, то GUID устройства всегда будет разный или всегда одинаковый?
у устройства нет GUID, есть код экземляра устройства. Например,
PCI\VEN_1969&DEV_1048&SUBSYS_822610 43&REV_B0\4&935E26E&0&00E3 (сетевая плата), такие коды есть у каждого нормального устройства. по нему и надо искать.

Цитата:
Сообщение от Koluna Посмотреть сообщение
2. При вызове SetupDiEnumDeviceInfo с параметром SPDRP_FRIENDLYNAME функция возвращает ERROR_INVALID_DATA (уточнял в MSDN). Пробовал для USB, Video, HID - везде такой результат. Почему? Неужели у устройств данных классов нету таких свойств?
что-то непонятно. константу SPDRP_FRIENDLYNAME надо передавать в SetupDiGetDeviceRegistryProperty. код в студию.
кстати, на какой системе работает программа?

Последний раз редактировалось rpy3uH; 02.03.2009 в 12:25.
rpy3uH вне форума Ответить с цитированием
Старый 02.03.2009, 12:32   #7
Koluna
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 18
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
на Delphi 7.2 всё нормально
Может, она сама типы неявно преобразовывает, галочка есть какая-нибудь...

Цитата:
у устройства нет GUID, есть код экземляра устройства. Например,
PCI\VEN_1969&DEV_1048&SUBSYS_822610 43&REV_B0\4&935E26E&0&00E3 (сетевая плата), такие коды есть у каждого нормального устройства. по нему и надо искать.
Понятно. Это называется "код экземляра устройства".
Мне тут не понятно только где его искать, этот "код экземляра устройства"!

Цитата:
что-то непонятно. константу SPDRP_FRIENDLYNAME надо передавать в SetupDiGetDeviceRegistryProperty. код в студию.
кстати, на какой системе работает программа?
Так оно и есть

Код:
      
...      
      PropertyBuffer_ := nil;
      PropertyBufferSize_ := 0;

      while not SetupDiGetDeviceRegistryProperty(DeviceInfoSet_,
                                                 DeviceInfoData_,
                                                 SPDRP_FRIENDLYNAME,
                                                 PropertyRegDataType_,
                                                 PropertyBuffer_,
                                                 PropertyBufferSize_,
                                                 PropertyBufferSize_) do
...
Часть других параметров работает, часть - то же самое...

WinXP, Delphi 7.
Koluna вне форума Ответить с цитированием
Старый 02.03.2009, 13:41   #8
Koluna
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 18
По умолчанию

Цитата:
Код экземпляра устройства можно узнать так: в Диспетчере устройств двойной щелчок по устройству (либо Свойства), перейти на вкладку Сведения, в списке выбрать Код Экземпляра Устройства. Ниже Вы увидите строчку, вроде этой:
HDAUDIO\FUNC_01&VEN_10EC&DEV_0883&S UBSYS_1462373D&REV_1000\4&92C812E&0 &0001
Вот он. С самого начала видел, но не поверил...
Для моего устройства код экземпляра устройства: USB\VID_0403&PID_6001\FTRXGIAZ
А не поверил, потомучто код маленький и простой. До этого попадались только большие и сложные
Koluna вне форума Ответить с цитированием
Старый 02.03.2009, 15:18   #9
Koluna
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 18
По умолчанию

Пытаюсь по коду экземпляра устройства получить структуру DeviceInfoData_ - не получается для любого кода... почему?
SetupDiEnumDeviceInfo возвращает ERROR_NO_MORE_ITEMS.
Кажется, SetupDiEnumDeviceInfo не находит устройства... почему?

Код:
...
function On_Off_Device(PnPID: PAnsiChar; State: Boolean): Boolean;

var
  DeviceInfoSet_ : HDEVINFO;
  DeviceInfoData_ : TSPDevInfoData;

begin
  DeviceInfoSet_ := SetupDiGetClassDevs(0, PnPID, 0, DIGCF_ALLCLASSES);
  if Integer(DeviceInfoSet_) = INVALID_HANDLE_VALUE then
  begin
    Result := False;
    Exit;
  end
  else
  begin
    DeviceInfoData_.cbSize := SizeOf(TSPDevInfoData);
    if not SetupDiEnumDeviceInfo(DeviceInfoSet_, 0, DeviceInfoData_) then
    begin
      Result := False;
      Exit;
    end;
  end;

  SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
end;
...
Вызываем функцию:
Код:
On_Off_Device('PCI\VEN_1969&DEV_2048&SUBSYS_28001565&REV_A0\4&2AD917F4&0&00E1, True)
Может быть я напутал где-то здесь?

Код:
  DeviceInfoSet_ := SetupDiGetClassDevs(0, PnPID, 0, DIGCF_ALLCLASSES);
В качестве образца использовал http://forum.sources.ru/index.php?showtopic=247846&st=0 (последний пост).

И это (последний пост):
http://forum.codenet.ru/showthread.php?threadid=32464

Последний раз редактировалось rpy3uH; 02.03.2009 в 19:31.
Koluna вне форума Ответить с цитированием
Старый 02.03.2009, 15:57   #10
Koluna
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 18
По умолчанию

Хм... оказывается, надо делать так:
Код:
DeviceInfoSet_ := SetupDiGetClassDevs(nil, PnPID, 0, DIGCF_ALLCLASSES or DIGCF_DEVICEINTERFACE);
Это из MSDN.
Странно, почему в приведённых мною примерах не так?
Koluna вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка Jedi компонент Dr.Badnezz Компоненты Delphi 9 23.11.2010 17:19
Работа с внешними устройствами через COM порт Georgios Помощь студентам 11 11.02.2009 15:59
Jedi Makarov Компоненты Delphi 2 15.08.2008 19:45
обновление в блоге - Работа с устройствами в Windows Pblog Обсуждение статей 0 03.06.2008 11:30
Win Api, работа с мышью Petrr Win Api 2 26.04.2008 18:58


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя