Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.051 c
2-1187114680
Spyro
2007-08-14 22:04
2007.09.09
Редактирование базы данных


2-1187042148
loeg
2007-08-14 01:55
2007.09.09
Не эмулируется нажатие кнопки. Что делаю неправильно?


2-1187320964
Alex7
2007-08-17 07:22
2007.09.09
TryStrToDate нужен пример использования функции.


2-1186858488
TStas
2007-08-11 22:54
2007.09.09
Описание ф-ции InternetGetConnectedState


2-1187530707
AlRal
2007-08-19 17:38
2007.09.09
Array of TStrings





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский