#include <Windows.h>
#include <tchar.h>
#include <stdio.h>TCHAR szServiceName[] = TEXT("MyTestService");DWORD dwThreadID;//HANDLE hEvent = INVALID_HANDLE_VALUE;SERVICE_STATUS status;SERVICE_STATUS_HANDLE hServiceStatus;SERVICE_STATUS_HANDLE gSvcStatusHandle;//初始化相关结构
void
Init(
 VOID
 );
//
void 
WINAPI 
ServiceMain(
VOID
);void 
LogEvent( 
LPCTSTR pFormat, 
...
);
//安装服务
BOOL 
InstallService(
VOID
);
//判断服务是否已安装
BOOL 
IsServiceInstalled(
VOID
);
//开启服务
BOOL
ServiceCtrlStart(
VOID
);
//停止服务
BOOL
ServiceCtrlStop(
VOID
);VOID
WINAPI
ServiceStrl(
DWORD dwOpcode
);//删除服务
BOOL
UninstanllService(
VOID
);BOOL 
DoTask(
VOID
);int main( int argc, char* argv[] )
{
Init();BOOL bRet = FALSE;SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};do 
{
bRet = InstallService();
if ( !bRet )
{
break;
}bRet = StartServiceCtrlDispatcher( st );
if ( !bRet)
{
DWORD dwError = GetLastError();
break;
}bRet = ServiceCtrlStart( );
if ( !bRet )
{
break;
}bRet = UninstanllService();
if ( !bRet )
{
break;
}} while( FALSE );return 0;
}//初始化相关结构
void Init()
{
hServiceStatus = NULL;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_STOPPED;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
}
//服务主线程函数,既用户选择开启服务时调用的函数
void WINAPI ServiceMain()
{
MessageBox( NULL, TEXT("zou ServiceMain"), NULL, MB_OK );
        hServiceStatus = RegisterServiceCtrlHandler( TEXT("MyTestService"), ServiceStrl );
if ( NULL == hServiceStatus )
{
MessageBox( NULL, (const char *)hServiceStatus, NULL, MB_OK );
}status.dwCurrentState = SERVICE_START_PENDING;status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//LogEvent( TEXT("ServiceMain") );while ( TRUE )
{
DoTask();
Sleep(5000);
break;
}if ( NULL == hServiceStatus )
{
//LogEvent( TEXT("Handler not installed") );
return;
}//SetServiceStatus( hServiceStatus, &status );
//如下代码可以为启动服务前的准备工作
//hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
//if ( hEvent == NULL )
//{
//status.dwCurrentState = SERVICE_STOPPED;//BOOL bRet = SetServiceStatus( hServiceStatus, &status );
//if ( !bRet )
//{
//DWORD dwError = GetLastError();
//}
//LogEvent( TEXT("Failure to start service") );
//return;
//}
//更改服务状态为启动
status.dwWin32ExitCode = S_OK;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus( hServiceStatus, &status );//等待用户选择停止服务,
//当然你也可以把你的服务代码用线程来执行,
//此时这里只需要等待线程结束即可.
//while ( WaitForSingleObject( hEvent, 10000 ) != WAIT_OBJECT_0 )
//{
//模拟服务的运行,应用时将主要任务放于此即可
//LogEvent( TEXT("Service runing...") );
//}//status.dwCurrentState = SERVICE_STOPPED;
//SetServiceStatus( hServiceStatus, &status );
//LogEvent( TEXT("Service stopped") );
}void LogEvent( LPCTSTR pFormat, ...)
{
TCHAR chMsg[259];
HANDLE hEventSource;
LPTSTR lpszString[1];va_list pArg;va_start( pArg, pFormat );_vstprintf( chMsg, pFormat, pArg );va_end( pArg );lpszString[0] = chMsg;hEventSource = RegisterEventSource( NULL, szServiceName );if ( hEventSource != NULL )
{
ReportEvent( hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*)&lpszString[0], NULL );
DeregisterEventSource( hEventSource );
}}
//安装服务
BOOL 
InstallService(
VOID
)
{   
TCHAR szFilePath[1024] = { 0 };
GetCurrentDirectory( 1024, szFilePath );
strcat( szFilePath, TEXT("//Debug//CreateMyService.exe") );
SC_HANDLE hSCM;
SC_HANDLE hService;BOOL bRet = FALSE;
do 
{
if ( IsServiceInstalled() )
{
break;
}hSCM = ::OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if ( NULL == hSCM )
{
DWORD dwError = GetLastError();
break;
}//GetModuleFileName( NULL, szFilePath, MAX_PATH );
//创建服务
hService = CreateService( hSCM,
          szServiceName,
  szServiceName,
                                          SERVICE_ALL_ACCESS,
                  SERVICE_WIN32_OWN_PROCESS,                                    SERVICE_DEMAND_START,
                  SERVICE_ERROR_IGNORE,
                                          szFilePath,
                                          NULL,
                                          NULL,
                                          NULL,
                                          NULL,
                                          NULL );if ( NULL == hService )
{
bRet = FALSE;
CloseServiceHandle( hSCM );
break;
}bRet = TRUE;::CloseServiceHandle( hService );
::CloseServiceHandle( hSCM );} while( FALSE );return bRet;}
//判断服务是否已安装
BOOL 
IsServiceInstalled(
VOID
)
{
SC_HANDLE hSCM;
SC_HANDLE hService;BOOL bRet = FALSE;
    do 
    {
hSCM = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if ( NULL == hSCM )
{
DWORD dwError = GetLastError();
break;
}hService = OpenService( hSCM, szServiceName, SERVICE_QUERY_CONFIG );
if ( NULL == hService )
{
DWORD dwError = GetLastError();
break;
}bRet = true;CloseServiceHandle( hService );
CloseServiceHandle( hSCM );    } while( FALSE );return bRet;
}
//删除服务
BOOL
UninstanllService(
VOID
)
{
BOOL bRet = FALSE;
do 
{
if ( !IsServiceInstalled() )
{
bRet = TRUE;
break;
}SC_HANDLE hSCM = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if ( NULL == hSCM )
{
bRet = FALSE;
break;
}SC_HANDLE hService = OpenService( hSCM, szServiceName, SERVICE_STOP | DELETE );
if ( NULL == hService )
{
CloseServiceHandle( hSCM );
bRet = FALSE;
}SERVICE_STATUS status;bRet = ControlService( hService, SERVICE_CONTROL_STOP, &status );
if ( !bRet )
{   
DWORD dwError = GetLastError();
break;
}bRet = DeleteService( hService );
if ( !bRet )
{
break;
}bRet = TRUE;CloseServiceHandle( hService );
CloseServiceHandle( hSCM );//LogEvent( _T("Service could not be deleted") );} while( FALSE );return bRet;
}
//开启服务
BOOL
ServiceCtrlStart(
VOID
)
{
BOOL bRet = FALSE;
do 
{
SC_HANDLE hScm;
SC_HANDLE hService;hScm = OpenSCManager( NULL, NULL, SC_MANAGER_CONNECT );
if ( NULL == hScm )
{
break;
}hService = OpenService( hScm, szServiceName, SC_MANAGER_ALL_ACCESS );
if ( NULL == hService )
{
break;
}
bRet = StartService( hService, 0, NULL );
if ( !bRet )
{
DWORD dwError = GetLastError();
break;
}bRet = TRUE;CloseServiceHandle( hService );
CloseServiceHandle( hScm );} while( FALSE );return bRet;
}
//停止服务
BOOL
ServiceCtrlStop(
VOID
)
{
BOOL bRet = FALSE; 
do 
{
SC_HANDLE  hSCM;
SC_HANDLE  hService;
SERVICE_STATUS  ServiceStatus;hSCM = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if ( NULL == hSCM )
{
break;
}hService = OpenService( hSCM, szServiceName, SERVICE_STOP | SERVICE_QUERY_STATUS );
if ( NULL == hService )
{
break;
}bRet = QueryServiceStatus( hService, &ServiceStatus );
if ( !bRet )
{
break;
}if ( SERVICE_RUNNING == ServiceStatus.dwCurrentState )
{
bRet = ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus );
if ( !bRet )
{
break;
}
}bRet = TRUE;CloseServiceHandle( hService );
CloseServiceHandle( hSCM );} while( FALSE );return bRet;
}
//服务控制函数
VOID
WINAPI
ServiceStrl(
DWORD dwOpcode
)
{
MessageBox( NULL, TEXT("zou ServiceStrl"), NULL, MB_OK );
switch( dwOpcode )
{case SERVICE_CONTROL_STOP:
{
status.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus( hServiceStatus, &status );
//SetEvent( hEvent );
//LogEvent( TEXT("want to stopped") );
break;
}case SERVICE_CONTROL_PAUSE:
{
break;
}case SERVICE_CONTROL_CONTINUE:
{
break;
}case SERVICE_CONTROL_INTERROGATE:
{
break;
}case SERVICE_CONTROL_SHUTDOWN:
{
break;
}default:
LogEvent( TEXT("hello") );
}
}BOOL 
DoTask(
VOID
)
{
INT iRet = MessageBox( NULL, TEXT("注册服务成功"), NULL, MB_OK );
return iRet;
}VC Win7 系统创建服务启动失败