ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
355442 Топик полностью
Лeoнид Ивaнoвич (19.09.2012 02:06, просмотров: 184) ответил 1111111 на Насколько помнится финал одного из обсуждений - хост тоже виснет, а его увы не так просто оживить как девайс. Если все таки приспичило, то одно из кошерных решений - прямо в разъеме ставить usb2com, а дальше в девайс передавать через
Виснет именно хост. Вроде, у кого-то получалось программно передергивать. Вот цитата с ixbt: Отключаю программно из своего приложения с помощью JEDI SetupAPI. Это эквивалентно пунктам контекстного меню "Отключить" и "Задействовать" менеджера устройств. Скачать и подключить с http://jedi-apilib.sourceforge.net/. Подключить в программу модули SetupApi, CfgMgr32, Cfg. Не забыть сделать LoadSetupApi, LoadConfigManagerApi, UnloadSetupApi, UnloadConfigManagerApi.
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;