Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать, установлен ли драйвер


ChainicDenis ©   (2007-03-16 20:00:00) 

Братцы, помогите..

Задача простая, запускается прога, которая использует виртуальный Com порт. Предполагается что пользователь его уже установил. Даже если и не установил беды не будет - нет порта и все дела. Проверяется легко.

Но хочется сделать типа сервис: прога запускается, проверяет есть ли драйвер и  если его нет запускает инсталятор, который создает из ресурса.

Вобщем защита от дурака. Ну снял кто-то галочку с "установить драйвер" в процессе инсталяции или банально экзешник перенес на другую машину, а мы ему раз и дрова ставим автоматом...

Спасибо.


Rouse_   (2007-03-18 20:16:00) [1]


> OpenSCManager - это в каком модуле?

WinSvc


ChainickDenis   (2007-03-18 17:14:00) [2]


> Rouse_ ©   (16.03.07 21:24) [10]


Что-то никак не пойму что надо подключить к проекту дабы все заработало..

OpenSCManager - это в каком модуле?

Спасибо.


easy   (2007-03-17 14:48:00) [3]


> Чем картинку сделал?

Это GeSHi


tesseract   (2007-03-17 11:50:00) [4]


> Rouse_ ©   (17.03.07 11:32) [13]


Давно пора тэги delphi разбирать :-)

Или сделать поддержку выгрузки и Gexperts :-)

ЗЫ: И завести тэг offtop :-)


Rouse_   (2007-03-17 11:32:00) [5]


> easy ©   (16.03.07 22:10) [12]

Чем картинку сделал?


easy   (2007-03-16 22:10:00) [6]

для истории -
http://dfc.com.ru/img/enumdrivers.png


ChainickDenis   (2007-03-16 21:53:00) [7]

Абалдеть...
Пойду разбираться.
Спасибо.

P.S. И самое прикольное что я раньше предполагал что понимаю в Делфи что-то...


Rouse_   (2007-03-16 21:24:00) [8]

Хорош оффтопить...

> Как узнать, установлен ли драйвер

Так-же как и обычно обычный сервис. Т.е. что-то типо этого:

procedure TfrmMain.EnumDrivers(const State: DWORD);
var
 hSCObject, hService: SC_HANDLE;
 lpServices, TmpEnum: PEnumServiceStatus;
 lpServiceConfig: PQueryServiceConfig;
 I, cbBuffSize, pcbBytesNeeded,
 lpServicesReturned, lpResumeHandle: DWORD;
begin
 lvReport.Items.BeginUpdate;
 try
   lvReport.Items.Clear;
   hSCObject := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE);
   if hSCObject <> 0 then
   try
     lpResumeHandle := 0;
     lpServices := nil;
     EnumServicesStatus(hSCObject, SERVICE_DRIVER, State,
       lpServices^, 0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle);
     if GetLastError = ERROR_MORE_DATA then
     begin
       GetMem(lpServices, pcbBytesNeeded);
       try
         cbBuffSize := pcbBytesNeeded;
         if EnumServicesStatus(hSCObject, SERVICE_DRIVER, State,
           lpServices^, cbBuffSize, pcbBytesNeeded, lpServicesReturned, lpResumeHandle) then
         begin
           TmpEnum := lpServices;
           for I := 0 to lpServicesReturned - 1 do
           begin
             with lvReport.Items.Add do
             begin
               Caption := TmpEnum^.lpServiceName;
               SubItems.Add(TmpEnum^.lpDisplayName);
               case TmpEnum^.ServiceStatus.dwCurrentState of
                 SERVICE_RUNNING: SubItems.Add('Работает');
                 SERVICE_STOPPED: SubItems.Add('Остановлен');
               else
                 SubItems.Add('Неизвестно');
               end;
               hService := OpenService(hSCObject, TmpEnum^.lpServiceName,
                 SERVICE_QUERY_CONFIG);
               if hService <> 0 then
               try
                 QueryServiceConfig(hService, nil, 0, pcbBytesNeeded);
                 if GetLastError = ERROR_INSUFFICIENT_BUFFER then
                 begin
                   cbBuffSize := pcbBytesNeeded;
                   GetMem(lpServiceConfig, pcbBytesNeeded);
                   try
                     if QueryServiceConfig(hService, lpServiceConfig,
                       cbBuffSize, pcbBytesNeeded) then
                     begin
                       SubItems.Add(lpServiceConfig^.lpBinaryPathName);
                       case lpServiceConfig^.dwServiceType of
                         SERVICE_FILE_SYSTEM_DRIVER:
                           SubItems.Add('Драйвер файловой системы');
                         SERVICE_KERNEL_DRIVER:
                           SubItems.Add('Драйвер режима ядра');
                       else
                         SubItems.Add('Неизвестный тип драйвера');
                       end;
                       SubItems.Add(lpServiceConfig^.lpLoadOrderGroup);
                     end;
                   finally
                     FreeMem(lpServiceConfig);
                   end;
                 end;
               finally
                 CloseServiceHandle(hService);
               end;
             end;
             Inc(TmpEnum);
           end;
         end;
       finally
         FreeMem(lpServices);
       end;
     end;
   finally
     CloseServiceHandle(hSCObject);
   end;
 finally
   lvReport.Items.EndUpdate;
   sbCount.Panels.Items[0].Text := ' Общее количество: ' +
     IntToStr(lvReport.Items.Count);
 end;
end;


ChainickDenis   (2007-03-16 21:21:00) [9]

Это я и есть. Для форума оказывается важен не ник а мыло - просто "k" забыл дописать.

Спасибо Чапай, но немножко не то. Дело в том что порт появляется только тогда когда его в USB воткнут. Тогда он и получит свое имя в этой ветке. А ситуация другая. Програ уже установленна, а одорудование не воткнуто, хотя дравер вероятно установленн. Как только воткнут - сразу и порт появится. А если драйвера нет, то втыкай - не втыкай.

Вот я и хочу оградить юзера от втыкания без драйвера.

Денис.


easy   (2007-03-16 21:18:00) [10]

Удалено модератором


Чапаев   (2007-03-16 20:45:00) [11]

Удалено модератором


easy   (2007-03-16 20:39:00) [12]

Удалено модератором


easy   (2007-03-16 20:35:00) [13]

Удалено модератором


easy   (2007-03-16 20:34:00) [14]

Удалено модератором


Чапаев   (2007-03-16 20:31:00) [15]

Удалено модератором


easy   (2007-03-16 20:27:00) [16]

Удалено модератором
Примечание: От сих и ниже ОФФТОП,,,


Чапаев   (2007-03-16 20:22:00) [17]

Денис, если со времён нашего сотрудничества особо радикальных перемен не было, то я бы проверял ветку реестра HKLM\HARDWARE\SERIALCOMM. У виртуальных портов довольно специфические имена (не знаю, как это правильно назвать).

ЗЫ. А ты всё ники меняешь... ;-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо