Windows Service Sample
宣告
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#include <crtdbg.h>
For Windows Service
#define UPDATE_TIME 1000
void WINAPI ServiceMain (DWORD argc, LPTSTR argv[]);
VOID WINAPI ServerCtrlHandler(DWORD);
//volatile static ShutFlag = FALSE;
static SERVICE_STATUS hServStatus;
static SERVICE_STATUS_HANDLE hSStat;
static LPTSTR ServiceName = _T("Replay");
HANDLE hStopEvent;
HANDLE hThreads[3]={NULL,NULL,NULL};
SERVICE_STATUS_HANDLE ssh;
DWORD WINAPI ThreadInit(LPVOID lpPrar);
VOID WINAPI ServerCtrlHandler( DWORD Control);
void SetTheServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwCheckPoint, DWORD dwWaitHint);
int lock = 1;
void callDMC();tmain啟動主程式
VOID _tmain (int argc, LPTSTR argv []){
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ ServiceName, ServiceMain },
{ NULL, NULL }
};
if (!StartServiceCtrlDispatcher (DispatchTable))
_tprintf (_T("Failed calling Replay StartServiceCtrlDispatcher: Code: %d !\n"), GetLastError());
return;
}ServiceMain的進入點,當建立Service即叫用
void WINAPI ServiceMain (DWORD argc, LPTSTR argv[]){
DWORD ThreadID, t;
ssh = RegisterServiceCtrlHandler( ServiceName, ServerCtrlHandler);
if(ssh==(SERVICE_STATUS_HANDLE)0){
_tprintf (_T("RegisterServiceCtrlHandler() failed , Error Code: %d !\n"), GetLastError());
return;
}
hStopEvent=CreateEvent(NULL,TRUE,FALSE,_T("ReplayEvent"));//Jay note: Service Event
if(hStopEvent==NULL){
_tprintf (_T("Create service event failed , Error Code: %d !\n"), GetLastError());
}
t=0;
hThreads[0]=CreateThread(NULL,0,ThreadInit, (LPVOID) t,0, &ThreadID);
if(hThreads[0]==NULL){
_tprintf (_T("Create service init process failed , Error Code: %d !\n"), GetLastError());
}
SetTheServiceStatus(SERVICE_RUNNING,0,0,0);
while(WaitForSingleObject(hStopEvent, 1000)!=WAIT_OBJECT_0)
{
_tprintf (_T("main loop !\n"));
}
if(hStopEvent)
CloseHandle(hStopEvent);
lock = 0;
if(hThreads[0])
CloseHandle(hThreads[0]);
SetTheServiceStatus(SERVICE_STOPPED,NO_ERROR,0,0);
return;
}ServerCtrlHandler
VOID WINAPI ServerCtrlHandler( DWORD Control)
// requested control code{
DWORD dwState=SERVICE_RUNNING;
switch (Control) {
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
dwState=SERVICE_STOP_PENDING;
break;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
SetTheServiceStatus(dwState, NO_ERROR,0,0);
if((Control==SERVICE_CONTROL_STOP) || (Control==SERVICE_CONTROL_SHUTDOWN))
{
if(!SetEvent(hStopEvent))
{
_tprintf (_T("Set service event failed , Error Code: %d !\n"), GetLastError());
}
}
return;
}SetTheServiceStatus設定新的服務狀態和檢查點
void SetTheServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwCheckPoint, DWORD dwWaitHint){
// Current status of the service.
SERVICE_STATUS ss;
// Disable control requests until the service is started.
if (dwCurrentState == SERVICE_START_PENDING)
ss.dwControlsAccepted = 0;
else
ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
// Other flags include SERVICE_ACCEPT_PAUSE_CONTINUE
// and SERVICE_ACCEPT_SHUTDOWN.
// Initialize ss structure.
ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ss.dwServiceSpecificExitCode = 0;
ss.dwCurrentState = dwCurrentState;
ss.dwWin32ExitCode = dwWin32ExitCode;
ss.dwCheckPoint = dwCheckPoint;
ss.dwWaitHint = dwWaitHint;
// Send status of the service to the Service Controller.
if (!SetServiceStatus(ssh, &ss))
{
_tprintf (_T("Set service state failed , Error Code: %d !\n"), GetLastError());
}
return;
}ThreadInit想要啟動的程式
DWORD WINAPI ThreadInit (LPVOID lpParam){
WinExec("net start \"Widows Service Name\"",SW_SHOWMINNOACTIVE);
return 0;
}有時候做Windows Service時,原本main的地方停止的地方會跑完,所以必須注意。
Comments
Post a Comment