Форум: "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