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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2013, 15:21   #1
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 56
По умолчанию Как программно установить драйвер

Доброго времени суток!
Не понимаю, теряюсь в догадках, как установить программно драйвер.
Итак, есть пакет драйверов от FTDI для интерфейсной микросхемы (мост USB - RS232/485). Он представляет собой набор .sys и .inf файлов. Эти драйвера, путем модификации .inf файла, можно настраивать под нужные скорости (в нем выставляются множители частот) Можно получить таким образом скорости до 12МБит по RS485. Для модификации этого файла есть "тюнер" специальный, от FTDI, в документации также есть подробные описания этих множителей, так что тюнер написать можно.
Проблема возникает, когда нужно довольно часто менять скорость порта. Каждый раз модифицировать .inf файлы и переустанавливать вручную драйвер очень неудобно, тем более для целевого пользователя. Возможно ли программно устанавливать драйвер в данном случае?
Nostra Sunt
Daemvil вне форума Ответить с цитированием
Старый 01.07.2013, 22:46   #2
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

А может просто перезагрузить компьютер?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 01.07.2013, 23:01   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

SetupAPI вас спасет, там видел установку драйверов из inf.
Цитата:
А может просто перезагрузить компьютер?
человек совсем иное спрашивает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.07.2013, 23:28   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Феникс, ++ http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Человек_Борща вне форума Ответить с цитированием
Старый 02.07.2013, 05:24   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от Daemvil Посмотреть сообщение
Эти драйвера, путем модификации .inf файла, можно настраивать под нужные скорости
Для начала смотрим в реестр, в HKCR. В нем .inf указывает на inffile, у которого есть ветка shell\Install\command, и команда в нем выглядит так:
Код:
%SystemRoot%\System32\rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 %1
В персом приближении команду можно взять на вооружение и, меняя имя секции, выполнять установку с нужными параметрами и удаление (обычно секция DefaultUninstall).

Если же нужно полностью программное управление, смотрим в MSDN функции, начинающиеся на SetupDi, типа SetupDiOpenDeviceInterfaceRegKey. Программно этими функциями не пользовался, больше подсказать не могу.

Возможно, в Windows Vista и выше команда установки в реестре уже выглядит по-другому.
Vapaamies вне форума Ответить с цитированием
Старый 09.07.2013, 16:10   #6
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 56
По умолчанию

Как говорится, "все болит, ничего не помогает".... Все перечисленные способы, приведенные здесь, дают просто тупой молчок системы. Все отрабатывает, но никаких сообщений никто не выдает, а изменения в драйверах не происходят. Пробую посредством функций типа SetupDi - выдает "Range Check"
Код:
function TForm1.InstallDriver(InfFile: String):boolean;
var
  ClassGUID: TGUID;
  ClassName: array [0..MAX_CLASS_NAME_LEN - 1] of Char;
  DeviceInfoSet: HWND;
  DeviceInfoData: SP_DEVINFO_DATA;
  HardwareId: array [0..HARDID_BUF_SIZE-1] of Char;
  Reboot: BOOL;
begin
  if not SetupDiGetINFClass(PChar(InfFile), @ClassGUID, @ClassName, MAX_CLASS_NAME_LEN, NIL) then
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  DeviceInfoSet:= SetupDiCreateDeviceInfoList(@ClassGUID, Handle);
  if (DeviceInfoSet = INVALID_HANDLE_VALUE) then
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  DeviceInfoData.cbSize:= sizeof(SP_DEVINFO_DATA);
  if not SetupDiCreateDeviceInfo(DeviceInfoSet, @ClassName, @ClassGUID, nil, Handle, DICD_GENERATE_ID, @DeviceInfoData) then
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  FillChar(HardwareId, HARDID_BUF_SIZE, 0);
  if not SetupDiSetDeviceRegistryPropertyA(DeviceInfoSet, @DeviceInfoData, SPDRP_HARDWAREID, @HardwareId, HARDID_BUF_SIZE) then
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  if not SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, @DeviceInfoData) then
  begin
    ShowMessage(SysErrorMessage(GetLastError));  вот здесь getlasterror возвращает ошибку "Range Check"
    Exit;
  end;
  Reboot:= False;
  if not UpdateDriverForPlugAndPlayDevices(Handle, @HardwareId, PChar(InfFile), INSTALLFLAG_FORCE, @Reboot) then
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  ShowMessage('');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  InstallDriver(ExtractFilePath(Application.ExeName)+'ftdiport.inf');

end;
Nostra Sunt
Daemvil вне форума Ответить с цитированием
Старый 09.07.2013, 17:05   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Если честно, представленный здесь код мне представляется бредом.

Нужно или разобрать логику inf-файла и генерировать соответствующие записи программно, или разбирать inf-файл, меняя параметры в нем по надобности, а потом ставить либо вызовом rundll32, либо написать его собственный аналог, начав, как понимаю, с SetupGetInfInformation, которая и разбирает inf-файл, превращая его строки в структуры, нужные функциям API.

Модуль SetupApi, кстати, есть в JEDI (JVCL). Чисто технически сделан весьма грамотно, а вот загрузка Setup API на лету мне кажется решением через задницу весьма спорной. Тем не менее, думаю, сам модуль вполне рабочий.

Добавлено: о, режим связывания можно менять условной директивой SETUPAPI_LINKONREQUEST. Беру свои слова про задницу назад. Поскольку сейчас поддержка Win9x не нужна и имеет смысл только юникодный API, присутствующий во всех версиях Windows, директива SETUPAPI_LINKONREQUEST должна быть всегда отключена.

Последний раз редактировалось Vapaamies; 09.07.2013 в 17:44.
Vapaamies вне форума Ответить с цитированием
Старый 13.08.2013, 09:21   #8
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 56
По умолчанию

Добрый день. Отпишусь, что решил через rundll32, но перед этим надо девайс вытащить из USB, тогда драйвера переустанавливаются на новые. Похоже, проблема программной переустановки драйверов "налету" через JEDI - это несовместимость 64 и 32-битных Windows-систем с приложениями другой битности У меня Win7 64bit, а Дельфи компилит 32-разрядные приложения. Соответственно под 32 заработало, под 64 - нет. Если логически рассуждать, то выходит странновато, т.к. Setupapi же должен быть подставлен виндой тоже рабочий (из system32 либо sysWOW64, в зависимости от разрядности приложения) И вообще не понятно, почему именно с драйверами не выходит такая процедура..
Nostra Sunt
Daemvil вне форума Ответить с цитированием
Старый 13.08.2013, 12:27   #9
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

После установки драйвера обязательно перезапустите компьютер, так как иначе система просто его не распознаст.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 13.08.2013, 12:55   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
После установки драйвера обязательно перезапустите компьютер, так как иначе система просто его не распознаст.
Не обязательно. Драйвера есть разные. Да и не в 90х живем. Перезапуск нужен только если железо самого ПК обновилось, да и то, не всегда.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как установить настраиваемые поля программно в MS Office Word? Slap Microsoft Office Word 1 10.12.2012 00:35
Как программно определить установлен ли драйвер. avd Общие вопросы Delphi 3 07.09.2012 13:11
Как программно установить службу в windows? KiL0z Общие вопросы Delphi 2 10.05.2011 02:29
Как установить драйвер (имеется только sys файл)? Stilet Компьютерное железо 7 05.08.2009 17:48