1. 程式人生 > >windows服務程序的編寫

windows服務程序的編寫

tail set register repo pri spa sdn fail shutdown

服務編寫
https://blog.csdn.net/lanuage/article/details/77937407

#include <windows.h> 
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#define SERVICE_NAME "SDK_Service"

SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hServiceStatusHandle;
void WINAPI service_main(int argc, char** argv);
void WINAPI ServiceHandler(DWORD fdwControl);

TCHAR szSvcName[80];
SC_HANDLE schSCManager;
SC_HANDLE schService;
int uaquit;
FILE* log;

DWORD WINAPI srv_core_thread(LPVOID para)
{
    int i = 0;
    for (;;)
    {
        if (uaquit)
        {
            break;
        }
        fprintf(log, "srv_core_thread run time count:%d\n", i++);
        Sleep(5000);
    }
    return NULL;
}

void WINAPI ServiceHandler(DWORD fdwControl)
{
    switch (fdwControl)
    {
    case SERVICE_CONTROL_STOP:
    case SERVICE_CONTROL_SHUTDOWN:
        ServiceStatus.dwWin32ExitCode = 0;
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;
        ServiceStatus.dwCheckPoint = 0;
        ServiceStatus.dwWaitHint = 0;
        uaquit = 1;
        //add you quit code here
        if (log != NULL)
            fclose(log);
        break;
    default:
        return;
    };
    if (!SetServiceStatus(hServiceStatusHandle, &ServiceStatus))
    {
        DWORD nError = GetLastError();
    }
}

void WINAPI service_main(int argc, char** argv)
{
    ServiceStatus.dwServiceType = SERVICE_WIN32;
    ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
    ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
    ServiceStatus.dwWin32ExitCode = 0;
    ServiceStatus.dwServiceSpecificExitCode = 0;
    ServiceStatus.dwCheckPoint = 0;
    ServiceStatus.dwWaitHint = 0;
    hServiceStatusHandle = RegisterServiceCtrlHandler(_T(SERVICE_NAME), ServiceHandler);
    if (hServiceStatusHandle == 0)
    {
        DWORD nError = GetLastError();
    }
    //add your init code here
    log = fopen("c:\\test.txt", "w");
    //add your service thread here
    HANDLE task_handle = CreateThread(NULL, NULL, srv_core_thread, NULL, NULL, NULL);
    if (task_handle == NULL)
    {
        fprintf(log, "create srv_core_thread failed\n");
    }

    // Initialization complete - report running status 
    ServiceStatus.dwCurrentState = SERVICE_RUNNING;
    ServiceStatus.dwCheckPoint = 0;
    ServiceStatus.dwWaitHint = 9000;
    if (!SetServiceStatus(hServiceStatusHandle, &ServiceStatus))
    {
        DWORD nError = GetLastError();
    }

}
//do not change main function
int main(int argc, const char *argv[])
{
    SERVICE_TABLE_ENTRY ServiceTable[2];

    ServiceTable[0].lpServiceName = _T(SERVICE_NAME);
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)service_main;

    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;
    // 啟動服務的控制分派機線程
    StartServiceCtrlDispatcher(ServiceTable);
    return 0;
}

編譯生成exe
用命令啟動 (其實是可以雙擊運行的)
這麽要註意是目錄路徑這個問題windows目錄向來就是惡心的我換了路徑就行了。
我放在F:下
管理員運行cmd
技術分享圖片
打開服務管理器 services.msc
技術分享圖片
技術分享圖片
技術分享圖片

https://blog.csdn.net/Fei_Liu/article/details/73395233
https://blog.csdn.net/qq_32688731/article/details/78323565
https://blog.csdn.net/u010499449/article/details/56671118
https://blog.csdn.net/fin86889003/article/details/26255387#

https://blog.csdn.net/flyingleo1981/article/details/53525194

windows服務程序的編寫