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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2011, 23:37   #1
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
Вопрос Программное отключение устройства

Доброго времени суток.
Есть определенное устройство(CD-ROM созданный на флешке), как программно отключить его? В интернете нашел несколько примеров но ни один не работал. =\
Вот самый близкий к тому что мне нужно пример, он запинается на строчке "if not SetupDiEnumDeviceInfo(DeviceInfoSet _, 0, DeviceInfoData_) then":
Код:
    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;
Вызываю данную функцию так:
Код:
if On_Off_Device('USBSTOR\CdRom', false) = true then
Form1.Log.Lines.Add('Успешно отключено') else
Form1.Log.Lines.Add('Ошибка отключения');

В качестве первого параметра пробовал ставить все указатели на экземпляр этого CD-ROM'а, результат тот же:
Цитата:
USBSTOR\CdRomUSB_2.0_USB_Flash_Driv e_0.00
USBSTOR\CdRomUSB_2.0_USB_Flash_Driv e_
USBSTOR\CdRomUSB_2.0_
USBSTOR\USB_2.0_USB_Flash_Drive_0
USB_2.0_USB_Flash_Drive_0
USBSTOR\GenCdRom
GenCdRom
USBSTOR\CdRom
Я плохо понимаю большую часть принципа работы этой функции но задача ее использования у меня разовая необходимость и притом срочная поэтому просьба в этот раз не отсылать читать литературу а просто подсказать что я делаю не так либо где косяки в функции.
Заранее огромное спасибо!
Crystallon вне форума Ответить с цитированием
Старый 09.10.2011, 09:56   #2
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

надо смотреть после какого именно условия происходит выход из функции и анализировать код ошибки
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программное отключение функции Светлана87 Microsoft Office Excel 17 09.09.2011 12:26
Сетевые устройства NightWish Помощь студентам 2 16.03.2011 17:25
Нужен ярлык на включение и отключение устройства wetchislaf Помощь студентам 2 22.10.2010 21:45
программное отключение монитора Dimarik Общие вопросы C/C++ 2 26.09.2009 18:05
Проблемма: Программное отключение "защиты формы" влияет на скорость выполнения программного кода... StrikeR33 Microsoft Office Word 0 28.05.2008 20:11