多服务应用程序只能启动一个服务?

「已注销」 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没有启动(没有写文件)?
...全文
47 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-10-26
  • 打赏
  • 举报
回复
能不能具体说明一下,如果能帮忙改下程序,可以再加分。
5t4rk 2011-10-26
  • 打赏
  • 举报
回复
你是要启动多个

应该是被占用了
科比布莱恩特 2011-10-26
  • 打赏
  • 举报
回复
要写文件,可以写成多个。

可能你的文件被以独占的方式打开了,然后其它的副本程序写不了这个文件了。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧