![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать, установлен ли драйвер
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. У виртуальных портов довольно специфические имена (не знаю, как это правильно назвать).
ЗЫ. А ты всё ники меняешь... ;-)