СообЧа > База Знаний > Программирование > Win32 API

Вопрос

Мне нужно написать службу (сервис), которая должна запускаться до того, как пользователь вошел в систему. При логоне. Есть параметр SERVICE_SYSTEM_START у функции CreateService — но он ставится только для служб-драйверов. Как быть?

Ответ

SERVICE_AUTO_START — Specifies a device driver or service started by the service control manager automatically during system startup.
Вот примерный код по добавлению сервиса, и его настройки, выдернут из проекта, поэтому кое что придJтся поменять, в том числе нужно заменить SERVICE_DEMAND_START на SERVICE_AUTO_START, тогда при загрузке системы, сервис будет автоматом запущен

{
SC_HANDLE hSCM,hService;
if ((hSCM=OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE)))
{
lstrcat(psSettings.szAppFileName,L" -");
lstrcat(psSettings.szAppFileName,lpcszCmdLineService);
if ((hService=CreateService(hSCM,lpcszServiceName,lpcszDisplayProductName, (SERVICE_CHANGE_CONFIG | SERVICE_START),SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE, psSettings.szAppFileName,0,0,0,0
,0)))
{
SC_ACTION sca[3];
SERVICE_FAILURE_ACTIONS sfa;
SERVICE_DESCRIPTION sd;
sca[0].Delay=1000;
sca[0].Type=SC_ACTION_RESTART;
sca[1]=sca[0];
sca[2]=sca[0];
sfa.dwResetPeriod=30;
sfa.lpRebootMsg=0;
sfa.lpCommand=0;
sfa.cActions=3;
sfa.lpsaActions=&sca[0];
sd.lpDescription=(LPWSTR)lpcszServiceDescription;
if (!ChangeServiceConfig2(hService,SERVICE_CONFIG_FAILURE_ACTIONS,&sfa)) ulRet=GetLastError();
if (!ChangeServiceConfig2(hService,SERVICE_CONFIG_DESCRIPTION,&sd)) ulRet=GetLastError();
CloseServiceHandle(hService);
}else{
ulRet=GetLastError();
}
CloseServiceHandle(hSCM);
}else{
ulRet=GetLastError();
}
if (ulRet) ReportError(ulRet);
}

и код для удаления сервиса

{
SC_HANDLE hSCM,hService;
if ((hSCM=OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE)))
{
if ((hService=OpenService(hSCM,lpcszServiceName,(SERVICE_STOP | DELETE))))
{
if (!DeleteService(hService)) ulRet=GetLastError();
CloseServiceHandle(hService);
}else{
ulRet=GetLastError();
}
CloseServiceHandle(hSCM);
}else{
ulRet=GetLastError();
}
if (ulRet) ReportError(ulRet);
}

Из конференции Expert_FAQ



Copyright © 2000-2004 Сообщество Чайников
Контактная информация