Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.09;
Скачать: CL | DM;

Вниз

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

 
ChainicDenis   (2007-03-16 20:00) [0]

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

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

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

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

Спасибо.


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

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

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


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

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


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

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


 
easy ©   (2007-03-16 20:34) [4]

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


 
easy ©   (2007-03-16 20:35) [5]

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


 
easy ©   (2007-03-16 20:39) [6]

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


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

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


 
easy ©   (2007-03-16 21:18) [8]

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


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

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

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

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

Денис.


 
Rouse_ ©   (2007-03-16 21:24) [10]

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

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

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

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:53) [11]

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

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


 
easy ©   (2007-03-16 22:10) [12]

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


 
Rouse_ ©   (2007-03-17 11:32) [13]


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

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


 
tesseract ©   (2007-03-17 11:50) [14]


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


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

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

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


 
easy ©   (2007-03-17 14:48) [15]


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

Это GeSHi


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


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


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

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

Спасибо.


 
Rouse_ ©   (2007-03-18 20:16) [17]


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

WinSvc



Страницы: 1 вся ветка

Текущий архив: 2007.09.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
15-1186642187
Проходящий
2007-08-09 10:49
2007.09.09
Opensource на Delphi


15-1186664541
antonn
2007-08-09 17:02
2007.09.09
вопросик по Html


15-1187144554
Slider007
2007-08-15 06:22
2007.09.09
С днем рождения ! 15 августа 2007 среда


15-1186408895
Sonia
2007-08-06 18:01
2007.09.09
Начальник заставляет любить JavaScript.....


2-1187355411
Arhipus
2007-08-17 16:56
2007.09.09
Расуспендить и засуспендить (3 вопроса)