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

Popular posts from this blog

[Linux] UVC Camera

UPnP Device Implementations

[UPnP] UPnP Implementers Corporation & UPnP Forum