多服务应用程序只能启动一个服务?
「已注销」 2011-10-26 05:04:12 #include <Windows.h>
#include <time.h>
#include <stdio.h>
#define SLEEP_TIME 1000
int WriteToLog1(char* str)
{
FILE* log;
log=fopen("c:\\service1.txt"
,"a+");
if (log==NULL)
return -1;
fprintf(log,"%s\n",str);
fclose(log);
return 0;
}
int WriteToLog2(char* str)
{
FILE* log;
log=fopen("c:\\service2.txt"
,"a+");
if (log==NULL)
return -1;
fprintf(log,"%s\n",str);
fclose(log);
return 0;
}
SERVICE_STATUS ServiceStatus1,ServiceStatus2;
SERVICE_STATUS_HANDLE hStatus1,hStatus2;
void ServiceMain1(int argc,char** argv);
void ServiceMain2(int argc,char** argv);
void ControlHandler1(DWORD request);
void ControlHandler2(DWORD request);
int InitService1();
int InitService2();
void main()
{
SERVICE_TABLE_ENTRY ServiceTable[3];
ServiceTable[0].lpServiceName="HAHA1";
ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain1;
ServiceTable[1].lpServiceName="HAHA2";
ServiceTable[1].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain2;
ServiceTable[2].lpServiceName=NULL;
ServiceTable[2].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ServiceTable);
};
void ServiceMain1(int argc,char**argv)
{
int error;
ServiceStatus1.dwServiceType=SERVICE_WIN32;
ServiceStatus1.dwCurrentState=SERVICE_START_PENDING;
ServiceStatus1.dwControlsAccepted=SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus1.dwWin32ExitCode=0;
ServiceStatus1.dwServiceSpecificExitCode=0;
ServiceStatus1.dwCheckPoint=0;
hStatus1=RegisterServiceCtrlHandler("HAHA1",(LPHANDLER_FUNCTION)ControlHandler1);
if (hStatus1==(SERVICE_STATUS_HANDLE)0)
{
return ;
}
error=InitService1();
if (error)
{
ServiceStatus1.dwCurrentState=SERVICE_STOPPED;
ServiceStatus1.dwWin32ExitCode=-1;
SetServiceStatus(hStatus1,&ServiceStatus1);
}
ServiceStatus1.dwCurrentState=SERVICE_RUNNING;
SetServiceStatus(hStatus1,&ServiceStatus1);
SYSTEMTIME time;
while (ServiceStatus1.dwCurrentState==SERVICE_RUNNING)
{
char buffer1[20];
GetLocalTime(&time);
sprintf(buffer1,"%04d%02d%02d%02d%02d%02d",time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);
int result=WriteToLog1(buffer1);
if (result)
{
ServiceStatus1.dwCurrentState=SERVICE_STOPPED;
ServiceStatus1.dwWin32ExitCode=-1;
SetServiceStatus(hStatus1,&ServiceStatus1);
return ;
}
Sleep(SLEEP_TIME);
}
return ;
}
void ServiceMain2(int argc,char**argv)
{
int error;
ServiceStatus2.dwServiceType=SERVICE_WIN32;
ServiceStatus2.dwCurrentState=SERVICE_START_PENDING;
ServiceStatus2.dwControlsAccepted=SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus2.dwWin32ExitCode=0;
ServiceStatus2.dwServiceSpecificExitCode=0;
ServiceStatus2.dwCheckPoint=0;
hStatus2=RegisterServiceCtrlHandler("HAHA2",(LPHANDLER_FUNCTION)ControlHandler2);
if (hStatus2==(SERVICE_STATUS_HANDLE)0)
{
return ;
}
error=InitService2();
if (error)
{
ServiceStatus2.dwCurrentState=SERVICE_STOPPED;
ServiceStatus2.dwWin32ExitCode=-1;
SetServiceStatus(hStatus2,&ServiceStatus2);
}
ServiceStatus2.dwCurrentState=SERVICE_RUNNING;
SetServiceStatus(hStatus2,&ServiceStatus2);
SYSTEMTIME time;
while (ServiceStatus2.dwCurrentState==SERVICE_RUNNING)
{
char buffer1[16];
GetLocalTime(&time);
sprintf(buffer2,"%04d%02d%02d%02d%02d%02d",time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);
int result=WriteToLog2(buffer1);
if (result)
{
ServiceStatus2.dwCurrentState=SERVICE_STOPPED;
ServiceStatus2.dwWin32ExitCode=-1;
SetServiceStatus(hStatus2,&ServiceStatus2);
return ;
}
Sleep(SLEEP_TIME);
}
return ;
}
void ControlHandler1(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
WriteToLog1("stopped1");
ServiceStatus1.dwWin32ExitCode=0;
ServiceStatus1.dwCurrentState=SERVICE_STOPPED;
SetServiceStatus(hStatus1,&ServiceStatus1);
return;
case SERVICE_CONTROL_SHUTDOWN:
WriteToLog1("stopped1");
ServiceStatus1.dwWin32ExitCode=0;
ServiceStatus1.dwCurrentState=SERVICE_STOPPED;
SetServiceStatus(hStatus1,&ServiceStatus1);
return;
default:
break;
}
SetServiceStatus(hStatus1,&ServiceStatus1);
return;
}
void ControlHandler2(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
WriteToLog2("stopped2");
ServiceStatus2.dwWin32ExitCode=0;
ServiceStatus2.dwCurrentState=SERVICE_STOPPED;
SetServiceStatus(hStatus2,&ServiceStatus2);
return;
case SERVICE_CONTROL_SHUTDOWN:
WriteToLog2("stopped2");
ServiceStatus2.dwWin32ExitCode=0;
ServiceStatus2.dwCurrentState=SERVICE_STOPPED;
SetServiceStatus(hStatus2,&ServiceStatus2);
return;
default:
break;
}
SetServiceStatus(hStatus2,&ServiceStatus2);
return;
}
int InitService1()
{
int result;
result=WriteToLog1("\nstarted1.\n");
return result;
}
int InitService2()
{
int result;
result=WriteToLog2("\nstarted2.\n");
return result;
}
谁能解释一下为什么程序运行后,只有Service1在写文件,Service2没有启动(没有写文件)?