Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2009, 19:33   #11
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Koluna Посмотреть сообщение
Понятно. Это называется "код экземляра устройства".
Мне тут не понятно только где его искать, этот "код экземляра устройства"!
код экземпляра устройства это составное имя. составляется он из нескольких параметров. в основном VendorID и ProductID. У одного класса устройств (например, USB флешки) они врядли повторятся.

Цитата:
Сообщение от Koluna Посмотреть сообщение
Вот он. С самого начала видел, но не поверил...
Для моего устройства код экземпляра устройства: USB\VID_0403&PID_6001\FTRXGIAZ
у моей флешки код экземляра такой USB\VID_0951&PID_1600\5B7202C4044C
VendorID и ProductID у флешек одной марки одинаковы, а буквы FTRXGIAZ или 5B7202C4044C наверно нужны чтобы уникализировать каждую флешку. точно не знаю

Для получения параметров устройства копай в сторону
SetupDiGetDeviceInterfacePropertyKe ys
SetupDiGetDeviceInterfaceProperty
и т.д.

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

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

Привожу свой код функции (работоспособный), которая выключает/включает устройство по коду экземпляра устройства.
Критика и полезные советы очень приветствуются. Хотелось бы в результате обсуждения получить не только работоспособный, но и простой, красивый и оптимизированный код

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

var
  DeviceInfoSet_ : HDEVINFO; // Хендл набора информации об устройствах.
  DeviceInfoData_ : TSPDevInfoData; // Структура информации об устройстве.
  SPPropChangeParams_ : TSPPropChangeParams;

begin
  DeviceInfoSet_ := nil;
// Получение хендла набора информации об устройстве по коду экземпляра устройства.
  DeviceInfoSet_ := SetupDiGetClassDevs(nil, PnPID, 0, DIGCF_ALLCLASSES or DIGCF_DEVICEINTERFACE);
  if Integer(DeviceInfoSet_) = INVALID_HANDLE_VALUE then
  begin
// Ошибка.
    Result := False;
    Exit;
  end
  else
  begin
// Хендл набора информации об устройстве получен.
    FillChar(DeviceInfoData_, SizeOf(TSPDevInfoData), 0);
    DeviceInfoData_.cbSize := SizeOf(TSPDevInfoData);
// Заполнение структуры информации об устройстве.
    if not SetupDiEnumDeviceInfo(DeviceInfoSet_, 0, DeviceInfoData_) then
    begin
// Ошибка.
      SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
      Result := False;
      Exit;
    end;

// Установка полей структуры
    SPPropChangeParams_.ClassInstallHeader.cbSize := SizeOf(TSPClassInstallHeader);
    SPPropChangeParams_.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
    SPPropChangeParams_.Scope := DICS_FLAG_GLOBAL;

    if State then SPPropChangeParams_.StateChange := DICS_ENABLE
    else SPPropChangeParams_.StateChange := DICS_DISABLE;

// Изменение состояния устройства.
    if not SetupDiSetClassInstallParams(DeviceInfoSet_,
                                        @DeviceInfoData_,
                                        @SPPropChangeParams_,
                                        SizeOf(TSPPropChangeParams)) then
    begin
// Ошибка.
      SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
      Result := False;
      Exit;
    end;
// Подтверждение изменения состояния устройства
// (повторный вызов функции SetupDiSetClassInstallParams).
    if not SetupDiSetClassInstallParams(DeviceInfoSet_,
                                        @DeviceInfoData_,
                                        @SPPropChangeParams_,
                                        SizeOf(TSPPropChangeParams)) then
    begin
// Ошибка.
      SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
      Result := False;
      Exit;
    end;

// Вызов установщика классов.
    if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, DeviceInfoSet_, @DeviceInfoData_) then
    begin
// Ошибка.
      SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
      Result := False;
      Exit;
    end;

  end; // Integer(DeviceInfoSet_) <> INVALID_HANDLE_VALUE

  Result := True;
// Освобождение хендла набора информации об устройствах.
  SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
end;
Попутно - несколько вопросов.

1. При вызове моей функции с параметром False для отключении устройства N раз подряд, чтобы включить устройство приходится вызывать эту функцию с параметром True тоже N раз подряд. Как будто где-то есть счётчик включения/выключения... Почему и зачем?
2. Хотелось бы прояснить работу SetupDiGetClassDevs. Без флага DIGCF_DEVICEINTERFACE - моя функция не работает. Хотя в других примерах видел вызывы и без этого флага (с параметром Enumerator!). Не понятна связь между параметром Enumerator и флагом DIGCF_DEVICEINTERFACE.
3. Хотелось бы знать как можно назвать по-русски следующие структуры, используемые при вызове функций: HDEVINFO (хендл на структуру ...), TSPDevInfoData (структура ...), TSPPropChangeParams (структура...). Не могу перевести нормально, а название поиметь хочется
Koluna вне форума Ответить с цитированием
Старый 03.03.2009, 11:47   #13
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Koluna Посмотреть сообщение
1. При вызове моей функции с параметром False для отключении устройства N раз подряд, чтобы включить устройство приходится вызывать эту функцию с параметром True тоже N раз подряд. Как будто где-то есть счётчик включения/выключения... Почему и зачем?
спроси у разработчиков Windows
тоже самое относится и потокам, если например, остановить поток N раз (SuspendThread), то надо и вовзбновить поток N раз (ResumeThread). так же и с некоторыми другими объектами

Цитата:
Сообщение от Koluna Посмотреть сообщение
2. Хотелось бы прояснить работу SetupDiGetClassDevs. Без флага DIGCF_DEVICEINTERFACE - моя функция не работает. Хотя в других примерах видел вызывы и без этого флага (с параметром Enumerator!). Не понятна связь между параметром Enumerator и флагом DIGCF_DEVICEINTERFACE.
MSDN
Цитата:
DIGCF_DEVICEINTERFACE
Return devices that support device interfaces for the specified device interface classes. This flag must be set in the Flags parameter if the Enumerator parameter specifies a device instance ID.
если Enumerator указан, то этот флаг надо обязательно установить.
rpy3uH вне форума Ответить с цитированием
Старый 03.03.2009, 12:01   #14
Koluna
Пользователь
 
Регистрация: 27.02.2009
Сообщений: 18
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
спроси у разработчиков Windows
тоже самое относится и потокам, если например, остановить поток N раз (SuspendThread), то надо и вовзбновить поток N раз (ResumeThread). так же и с некоторыми другими объектами
Это известно

Цитата:
MSDN
если Enumerator указан, то этот флаг надо обязательно установить.
Согласен! Да! В MSDN так и указано!
Но вот почему в
http://forum.sources.ru/index.php?showtopic=247846&st=0
и в
http://forum.codenet.ru/showthread.php?threadid=32464
иначе?!
Koluna вне форума Ответить с цитированием
Старый 03.03.2009, 17:47   #15
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Koluna Посмотреть сообщение
Согласен! Да! В MSDN так и указано!
Но вот почему в
http://forum.sources.ru/index.php?showtopic=247846&st=0
и в
http://forum.codenet.ru/showthread.php?threadid=32464
иначе?!
ничем, помочь не могу. не знаю
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка 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 20:45
обновление в блоге - Работа с устройствами в Windows Pblog Обсуждение статей 0 03.06.2008 12:30
Win Api, работа с мышью Petrr Win Api 2 26.04.2008 19:58