Службы в Windows
От: AlexeyStaf Россия  
Дата: 01.09.05 14:52
Оценка:
Подскажите, пожалуйста, ссылочки на документацию по работе со службами в VC++. В частности интересует как отключить, включить службу, узнать установлена, работает или не работает служба. Заранее благодарен.
-----
С уважением, Алексей.
Re: Службы в Windows
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 01.09.05 14:58
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

AS>Подскажите, пожалуйста, ссылочки на документацию по работе со службами в VC++. В частности интересует как отключить, включить службу, узнать установлена, работает или не работает служба. Заранее благодарен.


http://gzip.rsdn.ru/?summary/2393.xml
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Службы в Windows
От: SergH Россия  
Дата: 01.09.05 15:02
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

AS>Подскажите, пожалуйста, ссылочки на документацию по работе со службами в VC++. В частности интересует как отключить, включить службу, узнать установлена, работает или не работает служба. Заранее благодарен.


RSDN->Статьи->Базовые сервисы->Службы->Управление службами 1, 2
Делай что должно, и будь что будет
Re: Службы в Windows
От: algol Россия about:blank
Дата: 01.09.05 15:18
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

AS>Подскажите, пожалуйста, ссылочки на документацию по работе со службами в VC++. В частности интересует как отключить, включить службу, узнать установлена, работает или не работает служба. Заранее благодарен.


Windows Services Manager
Re: Службы в Windows
От: Anton Batenev Россия https://github.com/abbat
Дата: 01.09.05 17:32
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

AS>Подскажите, пожалуйста, ссылочки на документацию по работе со службами в VC++. В частности интересует как отключить, включить службу, узнать установлена, работает или не работает служба. Заранее благодарен.


Вот примерный код (выдрал с некоторыми изменениями из своего исходничка). Модифицируй под свои нужды.

// имя требуемой службы
LPCTSTR g_service_name = TEXT("MyService");
// строка запуска службы
LPCTSTR g_filename     = TEXT("c:\\winnt\\myservice.exe -service");

// запуск / остановка службы, возвращает true при успехе
bool ActivateService (bool fActivate)
{
    if (!CheckVersion())
        return false;
    
    SC_HANDLE hscm = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
    if (hscm==0)
        return false;
    
    SC_HANDLE hsrv = OpenService(hscm, g_service_name, SERVICE_STOP | SERVICE_START);
    if (hsrv==0)
    {
        CloseServiceHandle(hscm);
        return false;
    }

    if (fActivate)
    {
        if (!StartService(hsrv, 0, NULL))
        {
            CloseServiceHandle(hsrv);
            CloseServiceHandle(hscm);
            return false;
        }
    }
    else
    {
        SERVICE_STATUS sstatus;
        if (!ControlService(hsrv, SERVICE_CONTROL_STOP, &sstatus))
        {
            CloseServiceHandle(hsrv);
            CloseServiceHandle(hscm);
            return false;
        }
    }

    CloseServiceHandle(hsrv);
    CloseServiceHandle(hscm);

    return true;
}
//---------------------------------------------------------------------------
// возвращает true, если служба запущена
bool IsServiceStarted (void)
{
    if (!CheckVersion())
        return false;
    
    SC_HANDLE hscm = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
    if (hscm == 0)
        return false;
    
    SC_HANDLE hsrv = OpenService(hscm, g_service_name, SERVICE_QUERY_STATUS);
    if (hsrv == 0)
    {
        CloseServiceHandle(hscm);
        return false;
    }
    
    SERVICE_STATUS sstatus;
    if (!QueryServiceStatus(hsrv, &sstatus))
    {
        CloseServiceHandle(hsrv);
        CloseServiceHandle(hscm);
        return false;
    }

    CloseServiceHandle(hsrv);
    CloseServiceHandle(hscm);

    if (sstatus.dwCurrentState == SERVICE_RUNNING)
        return true;

    return false;
}
//---------------------------------------------------------------------------
// возвращает true, если служба установлена
bool IsServiceInstalled (void)
{
    if (!CheckVersion())
        return false;
    
    SC_HANDLE hscm = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
    if (hscm == 0)
        return false;
    
    SC_HANDLE hsrv = OpenService(hscm, g_service_name, SERVICE_QUERY_STATUS);
    if (hsrv == 0)
    {
        CloseServiceHandle(hscm);
        return false;
    }

    CloseServiceHandle(hsrv);
    CloseServiceHandle(hscm);
    
    return true;
}
//---------------------------------------------------------------------------
// установка службы, возвращает true при успехе
bool InstallService (void)
{
    if (!CheckVersion())
        return false;
    
    SC_HANDLE hscm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
    if (hscm == 0)
        return false;
    
    SC_HANDLE hsrv = CreateService(hscm, g_service_name, g_service_name, SERVICE_CHANGE_CONFIG, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, g_filename, 0, 0, 0, 0, 0);
    if (hsrv == 0)
    {
        CloseServiceHandle(hscm);
        return false;
    }
    
    if (ChangeServiceConfig(hsrv, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, g_filename, 0, 0, 0, 0, 0, g_service_name) == 0)
    {
        CloseServiceHandle(hsrv);
        CloseServiceHandle(hscm);
        return false;
    }
    
    CloseServiceHandle(hsrv);
    CloseServiceHandle(hscm);
    
    MessageBox(0, TEXT("Служба успешно установлена!"), TEXT("Внимание!"), MB_OK | MB_ICONINFORMATION);
    
    return true;
}
//---------------------------------------------------------------------------
// удаление службы, возвращает true при успехе
bool UninstallService (void)
{
    if (!CheckVersion())
        return false;
    
    SC_HANDLE hscm = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
    
    if (hscm == 0)
        return false;
    
    SC_HANDLE hsrv = OpenService(hscm, g_service_name, DELETE);
    if (hsrv == 0)
    {
        CloseServiceHandle(hscm);
        return false;
    }
    
    if (DeleteService(hsrv) == 0)
    {
        CloseServiceHandle(hsrv);
        CloseServiceHandle(hscm);
        return false;
    }
    
    CloseServiceHandle(hsrv);
    CloseServiceHandle(hscm);
    
    MessageBox(0, TEXT("Служба успешно удалена!"), TEXT("Внимание!"), MB_OK | MB_ICONERROR);

    return true;
}
//---------------------------------------------------------------------------

bool CheckVersion (void)
{
    OSVERSIONINFO ovi;
    ovi.dwOSVersionInfoSize = sizeof(ovi);

    GetVersionEx(&ovi);

    if (ovi.dwPlatformId != VER_PLATFORM_WIN32_NT)
    {
        MessageBox(0, TEXT("Для работы программы в режиме сервиса требуется ОС Windows NT 4.0 или выше"), TEXT("Ошибка!"), MB_OK | MB_ICONERROR);
        return false;
    }

    return true;
}
//---------------------------------------------------------------------------
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.