- 论坛徽章:
- 0
|
代码如下,报错为1060,平台是VS2005
// SCM_Test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <winsvc.h>
#include "App.h"
using namespace std;
static struct
{
HANDLE service_thread; /* thread service/monitor handle */
DWORD service_thread_id;/* thread service/monitor ID */
HANDLE service_init; /* controller thread init mutex */
HANDLE service_term; /* NT service thread kill signal */
SERVICE_STATUS ssStatus;
SERVICE_STATUS_HANDLE hServiceStatus;
} globdat;
static char const* signal_arg = NULL;
static char op_service_name[256] = {"openPlant"};
static char op_display_name[256] = {"openPlant"};
HANDLE shutdown_event;
HANDLE restart_event;
static int ReportStatusToSCMgr(int currentState, int exitCode, int waitHint)
{
static int checkPoint = 1;
int rv = 0;
if (globdat.hServiceStatus)
{
if (currentState == SERVICE_RUNNING) {
globdat.ssStatus.dwWaitHint = 0;
globdat.ssStatus.dwCheckPoint = 0;
globdat.ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
}
else if (currentState == SERVICE_STOPPED) {
globdat.ssStatus.dwWaitHint = 0;
globdat.ssStatus.dwCheckPoint = 0;
if (!exitCode && globdat.ssStatus.dwCurrentState != SERVICE_STOP_PENDING) {
// An unexpected exit? Better to error!
exitCode = 1;
}
if (exitCode) {
globdat.ssStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
globdat.ssStatus.dwServiceSpecificExitCode = exitCode;
}
}
else {
globdat.ssStatus.dwCheckPoint = ++checkPoint;
globdat.ssStatus.dwControlsAccepted = 0;
if(waitHint)
globdat.ssStatus.dwWaitHint = waitHint;
}
globdat.ssStatus.dwCurrentState = currentState;
rv = SetServiceStatus(globdat.hServiceStatus, &globdat.ssStatus);
}
return(rv);
}
void WINAPI ServiceControlHandler( DWORD controlCode )
{
switch ( controlCode )
{
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 30000);
SetEvent(shutdown_event);
return;
case SERVICE_OP_RESTART:
ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, 30000);
SetEvent(restart_event);
return;
}
ReportStatusToSCMgr(globdat.ssStatus.dwCurrentState, NO_ERROR, 0);
}
static int signal_service_transition(SC_HANDLE schService, DWORD signal, DWORD pending, DWORD complete)
{
if (signal && !ControlService(schService, signal, &globdat.ssStatus))
return FALSE;
do {
Sleep(1000);
if (!QueryServiceStatus(schService, &globdat.ssStatus))
return FALSE;
} while (globdat.ssStatus.dwCurrentState == pending);
return (globdat.ssStatus.dwCurrentState == complete);
}
int op_service_start(int argc, char *argv[])
{
fprintf(stderr, "Starting the %s service\n", op_display_name);
SC_HANDLE schService;
SC_HANDLE schSCManager;
const char **start_argv;
int rv;
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!schSCManager)
{
fprintf(stderr, "Failed to open the WinNT service manager\n");
}
schService = OpenService(schSCManager, (LPCTSTR)op_service_name, SERVICE_STOP);
if (!schService) {
rv = GetLastError();
fprintf(stderr, "Failed to open the %s service\n", op_display_name );
rv = GetLastError();
CloseServiceHandle(schSCManager);
return (rv);
}
if (QueryServiceStatus(schService, &globdat.ssStatus)
&& (globdat.ssStatus.dwCurrentState == SERVICE_RUNNING)) {
fprintf(stderr, "Service %s is already started!\n", op_service_name);
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return 0;
}
start_argv = (const char **)malloc((argc + 1) * sizeof(const char **));
memcpy(start_argv, argv, argc * sizeof(char **));
start_argv[argc] = NULL;
if (StartService(schService, argc, (LPCTSTR*)start_argv)
&& signal_service_transition(schService, 0, //test only
SERVICE_START_PENDING,
SERVICE_RUNNING))
{
rv = 0;
fprintf(stderr, "The %s service has started\n", op_display_name);
}else
rv = GetLastError();
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return rv;
}
int _tmain(int argc, char * argv[])
{
op_service_start(argc, argv);
getchar();
return 0;
}
|
|
|