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
循环的主体是否执行过?很难真正调试服务;(我还没有这么做,但我相信如果你看一下(例如),这是可能的。此外,看起来你至少可以登录到磁盘上的一个文件。