#pragma region 包含与常量
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <tchar.h>
#include <iostream>
#include <stdlib.h>#define SVC_NAME  "cservice"
#define SLEEP_TIME 5000
#define WriteToLogFILE "C:\\cservice.txt"#pragma endregion 包含与常量#pragma region Logschar* GetFormatError()
{
DWORD nErrorNo = GetLastError (); // 得到错误代码
LPSTR lpBuffer;    
FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER  | 
FORMAT_MESSAGE_IGNORE_INSERTS  | 
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
nErrorNo, // 此乃错误代码,通常在程序中可由 GetLastError()得之
LANG_NEUTRAL,
(LPTSTR) & lpBuffer,
0 ,
NULL );
char* ret_str = lpBuffer;
//  Free the buffer. 
LocalFree (lpBuffer);
return ret_str;
}int WriteToLog(char* str)
{
FILE* log;
log = fopen(WriteToLogFILE, "a+");
if (log == NULL)
return -1;
fprintf(log, "%s\n", str);
fclose(log);
return 0;
}//void LOG(char *logMsg)
//{
// char buf[MAX_PATH];
// strcpy(buf,logMsg);
// sprintf(buf,"\t%s %s",logMsg,GetFormatError());
// WriteToLog(buf);
//}
#pragma endregion WriteLogsSERVICE_STATUS ServiceStatus; 
SERVICE_STATUS_HANDLE hStatus;
SC_HANDLE m_hSCManager = NULL;#pragma region 函数声明
void ServiceMain(int argc, char** argv); void ControlHandler(DWORD request); BOOL IsAdd(char* service_name);BOOL AddNtService(char* service_name);int RegisterService(char* service_name);void StartService(char* service_name);void StopService( char* service_name );void RemoveService( char* service_name );DWORD GetServiceStatus(char* service_name);int SCM_entry(char* service_name);
#pragma endregion 函数声明int main(int argc, char **argv)
{
WriteToLog("main()-----------------------------------------------------------------");
if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/")))
{
if(_stricmp("install",argv[1]+1)==0)
{
AddNtService(SVC_NAME);
}
else if(_stricmp("start",argv[1]+1)==0)
{
StartService(SVC_NAME);
}
else if(_stricmp("stop",argv[1]+1)==0)
{
StopService(SVC_NAME);
}
else if(_stricmp("remove",argv[1]+1)==0)
{
StopService(SVC_NAME);
RemoveService(SVC_NAME);
}
else
{
printf("usage:\n\t-install to install\n\t-start to start\n\t-stop to stop\n\t-remove to remove");
}
}
else
{
if (IsAdd(SVC_NAME))
{
SCM_entry(SVC_NAME);
}
}
return 0;
}#pragma region 函数定义
void ServiceMain(int argc, char** argv) 

WriteToLog("ServiceMain()");
int error;  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;  hStatus = RegisterServiceCtrlHandler(
"MemoryStatus", 
(LPHANDLER_FUNCTION)ControlHandler); 

if (hStatus == (SERVICE_STATUS_HANDLE)0) 

// Registering Control Handler failed
return; 
}   
// We report the running status to SCM. 
ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
SetServiceStatus (hStatus, &ServiceStatus); // The worker loop of a service
while (ServiceStatus.dwCurrentState == 
SERVICE_RUNNING)
{
WriteToLog("servicemain loop");
Sleep(SLEEP_TIME);
}
return; 
}void ControlHandler(DWORD request) 

WriteToLog("ControlHandler()"); switch(request) 

case SERVICE_CONTROL_STOP: 
WriteToLog("Monitoring stopped."); ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
break; case SERVICE_CONTROL_SHUTDOWN: 
WriteToLog("Monitoring shutdown."); ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
break;  case SERVICE_CONTROL_PAUSE: 
WriteToLog("Monitoring pause.");
 
ServiceStatus.dwCurrentState = SERVICE_PAUSED; 
break; case SERVICE_CONTROL_CONTINUE: 
WriteToLog("Monitoring continue."); ServiceStatus.dwCurrentState = SERVICE_START_PENDING; 
break;  default:
break;
}  // Report current status
ServiceStatus.dwWin32ExitCode = 0; 
SetServiceStatus (hStatus, &ServiceStatus);
WriteToLog("control return");
return; 
}int RegisterService(char* service_name)
{
WriteToLog("RegisterService called\n");
if (!IsAdd(service_name))
{
AddNtService(service_name);
return 0;     //if this is first running,  return. and the user must entry system service start service
} SERVICE_TABLE_ENTRY ServiceTable[]=

{service_name,(LPSERVICE_MAIN_FUNCTION)ServiceMain}, 
{NULL,NULL} 
}; // Start the control dispatcher thread for our service
if (!::StartServiceCtrlDispatcher(ServiceTable) )
{
//LOG("StartServiceCtrlDispatcher faild, error code:");
}
return 0;
}BOOL AddNtService(char* service_name)
{
WriteToLog("AddNtService()");
if (m_hSCManager == NULL)
{
m_hSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
} int STRLEN = _tcslen(service_name)+1;
char *m_SVC_NAME = new char[STRLEN];
_tcscpy(m_SVC_NAME, service_name); char Binary_exe[MAX_PATH];
::GetModuleFileName(NULL, Binary_exe,MAX_PATH); SC_HANDLE service = ::CreateService(
m_hSCManager,service_name,service_name,
SERVICE_ALL_ACCESS,
SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
Binary_exe,
NULL,
NULL,
_T("RPCSS\0"),
NULL,
NULL);
if (service == NULL)
{
//LOG("Create service faild error:");
return FALSE;
} WriteToLog("Create service success\n");
::CloseServiceHandle(service); return TRUE;
}BOOL IsAdd( char* service_name )
{
WriteToLog("AddOrRun()"); if (m_hSCManager == NULL)
{
m_hSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
}
SC_HANDLE hAdd = OpenService(m_hSCManager,service_name,SERVICE_ALL_ACCESS);
if (hAdd == NULL)
{
//LOG("OpenService in AddOrRun error:");
CloseServiceHandle(hAdd);
return FALSE;
}
CloseServiceHandle(hAdd); return TRUE;
}void StartService( char* service_name )
{
WriteToLog("StartService()"); // 打开服务管理对象
SC_HANDLE hSC = OpenSCManager( NULL, 
NULL, GENERIC_EXECUTE);
if( hSC == NULL)
{
//LOG("open SCManager error:");
return;
} // 打开www服务。
SC_HANDLE hSvc = OpenService( hSC, service_name,
SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);
if( hSvc == NULL)
{
//LOG( "Open SVC error:");
CloseServiceHandle( hSC);
return;
} // 获得服务的状态
SERVICE_STATUS status;
if( QueryServiceStatus( hSvc, &status) == FALSE)
{
//LOG( "Get Service state error:");
CloseServiceHandle( hSvc);
//CloseServiceHandle( hSC);
return;
} if(status.dwCurrentState == SERVICE_STOPPED)
{
// 启动服务
if( ::StartService( hSvc, NULL, NULL) == FALSE)
{
//LOG( "start service error:");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return;
} // 等待服务启动
while( ::QueryServiceStatus( hSvc, &status) == TRUE)
{
Sleep( status.dwWaitHint);
if( status.dwCurrentState == SERVICE_RUNNING)
{
CloseServiceHandle( hSvc);
//CloseServiceHandle( hSC);
WriteToLog("Start succeed");
return;
} }
} WriteToLog( "start error。");
CloseServiceHandle( hSvc);
//CloseServiceHandle( hSC);
return;
}void StopService( char* service_name )
{
return;//待实现
}void RemoveService( char* service_name )
{
return;//待实现
}DWORD GetServiceStatus( char* service_name )
{
WriteToLog("GetServiceStatus()");
// 打开服务管理对象
if (m_hSCManager == NULL)
{
m_hSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
}
if( m_hSCManager == NULL)
{
//LOG( "open SCManager error:");
return -1;
} // 打开服务。
SC_HANDLE hSvc = ::OpenService( m_hSCManager, service_name,
SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);
if( hSvc == NULL)
{
//LOG( "Open SVC error。");
::CloseServiceHandle( m_hSCManager);
return -1;
} // 获得服务的状态
if( ::QueryServiceStatus( hSvc, &ServiceStatus) == FALSE)
{
//LOG( "Get Service state error:");
::CloseServiceHandle( hSvc);
//::CloseServiceHandle( m_hSCManager);
return -1;
}
::CloseServiceHandle( hSvc);
char buf[MAX_PATH];
sprintf(buf,"\tGetServiceStatus returned %d",ServiceStatus.dwCurrentState);
WriteToLog(buf);
return ServiceStatus.dwCurrentState;
}int SCM_entry( char* service_name)
{
SERVICE_TABLE_ENTRY ServiceTable[]=

{service_name,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
{NULL,NULL} 
}; // Start the control dispatcher thread for our service
if (!::StartServiceCtrlDispatcher(ServiceTable) )
{
//LOG("StartServiceCtrlDispatcher faild, error code:");
}
return 0;
}
#pragma endregion 函数定义