Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;让服务做点什么_C++_Service - Fatal编程技术网

C++ C++;让服务做点什么

C++ C++;让服务做点什么,c++,service,C++,Service,我用教程做了一个服务。我怎样才能让它真正做点什么?代码如下: #include <windows.h> SERVICE_STATUS serviceStatus = { 0 }; SERVICE_STATUS_HANDLE statusHandle; HANDLE serviceStopEvent = INVALID_HANDLE_VALUE; void WINAPI ServiceMain(DWORD argc, LPTSTR *argv); void WINAPI Servi

我用教程做了一个服务。我怎样才能让它真正做点什么?代码如下:

#include <windows.h>

SERVICE_STATUS serviceStatus = { 0 };
SERVICE_STATUS_HANDLE statusHandle;
HANDLE serviceStopEvent = INVALID_HANDLE_VALUE;

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandler(DWORD);
DWORD WINAPI ServiceWorkerThread(LPVOID lParam);

#define SERVICE_NAME "Cool Service"

int main(int argc, char **argv)
{
    SERVICE_TABLE_ENTRY serviceTable[] = 
    {
        {SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain},
        {NULL, NULL}
    };

    if (!StartServiceCtrlDispatcher(serviceTable))
        return GetLastError();

    return 0;
}

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
    DWORD status = E_FAIL;

    statusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceCtrlHandler);
    if (statusHandle == NULL)
        goto EXIT;

    ZeroMemory(&serviceStatus, sizeof(serviceStatus));
    serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    serviceStatus.dwControlsAccepted = 0;
    serviceStatus.dwCurrentState = SERVICE_START_PENDING;
    serviceStatus.dwWin32ExitCode = 0;
    serviceStatus.dwServiceSpecificExitCode = 0;
    serviceStatus.dwCheckPoint = 0;

    if (!SetServiceStatus(statusHandle, &serviceStatus))
        OutputDebugString("Cool Service: Service Main: SetServiceStatus returned error!");

    serviceStopEvent = CreateEvent(NULL, true, false, NULL);
    if (serviceStopEvent == NULL)
    {
        serviceStatus.dwControlsAccepted = 0;
        serviceStatus.dwCurrentState = SERVICE_STOPPED;
        serviceStatus.dwWin32ExitCode = GetLastError();
        serviceStatus.dwCheckPoint = 1;

        if (!SetServiceStatus(statusHandle, &serviceStatus))
            OutputDebugString("Cool Service: Service Main: SetServiceStatus returned error!");

        goto EXIT;
    }

    serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    serviceStatus.dwCurrentState = SERVICE_RUNNING;
    serviceStatus.dwWin32ExitCode = 0;
    serviceStatus.dwCheckPoint = 0;

    if (!SetServiceStatus(statusHandle, &serviceStatus))
        OutputDebugString("Cool Service: Service Main: SetServiceStatus returned error!");

    HANDLE thread = CreateThread(NULL, 0, ServiceWorkerThread, NULL, 0, NULL);
    WaitForSingleObject(thread, INFINITE);

    CloseHandle(serviceStopEvent);

    serviceStatus.dwControlsAccepted = 0;
    serviceStatus.dwCurrentState = SERVICE_STOPPED;
    serviceStatus.dwWin32ExitCode = 0;
    serviceStatus.dwCheckPoint = 3;

    if (!SetServiceStatus(statusHandle, &serviceStatus))
        OutputDebugString("Cool Service: Service Main: SetServiceStatus returned error!");

EXIT:
    return;
}

void WINAPI ServiceCtrlHandler(DWORD ctrlCode)
{
    switch (ctrlCode)
    {
        case SERVICE_CONTROL_STOP:
        {
            if (serviceStatus.dwCurrentState != SERVICE_RUNNING)
                break;

            serviceStatus.dwControlsAccepted = 0;
            serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
            serviceStatus.dwWin32ExitCode = 0;
            serviceStatus.dwCheckPoint = 4;

            if (!SetServiceStatus(statusHandle, &serviceStatus))
                OutputDebugString("Cool Service: Service Handler: SetServiceStatus returned error!");

            SetEvent(serviceStopEvent);
            break;
        }

        default: break;
    }
}

void Function()
{
    Beep(7000, 1000);
}

DWORD WINAPI ServiceWorkerThread(LPVOID lParam)
{
    while (WaitForSingleObject(serviceStopEvent, 0) != WAIT_OBJECT_0)
    {
        Function();
        Sleep(3000);
    }

    return ERROR_SUCCESS;
}
#包括
服务状态serviceStatus={0};
服务状态句柄状态句柄;
HANDLE serviceStopEvent=无效的\u句柄\u值;
void WINAPI ServiceMain(DWORD argc,LPTSTR*argv);
作废WINAPI服务CtrlHandler(DWORD);
DWORD WINAPI ServiceWorkerThread(LPVOID LPRAM);
#定义服务名称“酷服务”
int main(int argc,字符**argv)
{
服务表条目服务表[]=
{
{SERVICE_NAME,(LPSERVICE_MAIN_函数)ServiceMain},
{NULL,NULL}
};
如果(!StartServiceCtrlDispatcher(serviceTable))
返回GetLastError();
返回0;
}
void WINAPI ServiceMain(DWORD argc,LPTSTR*argv)
{
DWORD状态=E_故障;
statusHandle=RegisterServiceCtrlHandler(服务名称,ServiceCtrlHandler);
if(statusHandle==NULL)
转到出口;
零内存(&serviceStatus,sizeof(serviceStatus));
serviceStatus.dwServiceType=SERVICE\u WIN32\u OWN\u进程;
serviceStatus.dwControlsAccepted=0;
serviceStatus.dwCurrentState=服务\启动\挂起;
serviceStatus.dwWin32ExitCode=0;
serviceStatus.dwServiceSpecificExitCode=0;
serviceStatus.dwCheckPoint=0;
if(!SetServiceStatus(状态句柄和服务状态))
OutputDebugString(“酷服务:服务主:SetServiceStatus返回错误!”);
serviceStopEvent=CreateEvent(NULL、true、false、NULL);
if(serviceStopEvent==NULL)
{
serviceStatus.dwControlsAccepted=0;
serviceStatus.dwCurrentState=服务\u已停止;
serviceStatus.dwWin32ExitCode=GetLastError();
serviceStatus.dwCheckPoint=1;
if(!SetServiceStatus(状态句柄和服务状态))
OutputDebugString(“酷服务:服务主:SetServiceStatus返回错误!”);
转到出口;
}
serviceStatus.dwControlsAccepted=服务接受停止;
serviceStatus.dwCurrentState=正在运行的服务;
serviceStatus.dwWin32ExitCode=0;
serviceStatus.dwCheckPoint=0;
if(!SetServiceStatus(状态句柄和服务状态))
OutputDebugString(“酷服务:服务主:SetServiceStatus返回错误!”);
HANDLE thread=CreateThread(NULL,0,ServiceWorkerThread,NULL,0,NULL);
WaitForSingleObject(线程,无限);
CloseHandle(serviceStopEvent);
serviceStatus.dwControlsAccepted=0;
serviceStatus.dwCurrentState=服务\u已停止;
serviceStatus.dwWin32ExitCode=0;
serviceStatus.dwCheckPoint=3;
if(!SetServiceStatus(状态句柄和服务状态))
OutputDebugString(“酷服务:服务主:SetServiceStatus返回错误!”);
出口:
返回;
}
无效WINAPI服务CtrlHandler(DWORD ctrlCode)
{
开关(ctrlCode)
{
案例服务控制站:
{
if(serviceStatus.dwCurrentState!=正在运行的服务)
打破
serviceStatus.dwControlsAccepted=0;
serviceStatus.dwCurrentState=服务\u停止\u挂起;
serviceStatus.dwWin32ExitCode=0;
serviceStatus.dwCheckPoint=4;
if(!SetServiceStatus(状态句柄和服务状态))
OutputDebugString(“酷服务:服务处理程序:SetServiceStatus返回错误!”);
SetEvent(serviceStopEvent);
打破
}
默认:中断;
}
}
空函数()
{
嘟嘟声(7000、1000);
}
DWORD WINAPI ServiceWorkerThread(LPVOID LPRAM)
{
while(WaitForSingleObject(serviceStopEvent,0)!=等待对象0)
{
函数();
睡眠(3000);
}
返回错误\成功;
}

在我安装并在“services.msc”中启动服务后,该服务不会执行任何操作,它应该会发出嘟嘟声,对吗?或者我的想法偏离了方向。谢谢您的帮助:)

蜂鸣音功能的返回值是多少?
ServiceWorkerThread
中的
while
循环的主体是否执行过?很难真正调试服务;(我还没有这么做,但我相信如果你看一下(例如),这是可能的。此外,看起来你至少可以登录到磁盘上的一个文件。