为什么创建的Windows服务不能暂停

paerxiushi 2008-10-13 10:43:08
我新建了Windows服务,在调用CreateService的时候,明明指定了SERVICE_ALL_ACCESS的服务权限,为什么在服务管理器中,那个服务的右键菜单是灰色,而且停止了之后就会报错:
DWORD dw;
DWORD dwID;
SC_HANDLE scmHandle;
SC_HANDLE serviceHandle;
SERVICE_STATUS_HANDLE statusHanle;
SERVICE_STATUS status;
VOID WINAPI Handler(DWORD fdwControl)
{
FILE* file;
int i=0;
switch (fdwControl)
{
case SERVICE_CONTROL_STOP:
status.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(statusHanle, &status);
PostThreadMessage(dwID, WM_CLOSE, 0, 0);
break;
case SERVICE_CONTROL_PAUSE:

file=fopen("C:\\abc.txt","a+");

fputs("服务暂停",file);

fclose(file);
break;
case SERVICE_CONTROL_CONTINUE:
file=fopen("C:\\abc.txt","a+");

fputs("服务继续",file);

fclose(file);
break;
case SERVICE_CONTROL_INTERROGATE:
file=fopen("C:\\abc.txt","a+");

fputs("服务交互",file);
break;
case SERVICE_CONTROL_SHUTDOWN:
file=fopen("C:\\abc.txt","a+");

fputs("服务关闭",file);
break;
default:
break;
}

}
VOID WINAPI ServiceMain(
DWORD dwArgc,
LPTSTR* lpszArgv
)
{
statusHanle=RegisterServiceCtrlHandler(_T("MyService"),(LPHANDLER_FUNCTION)Handler);

status.dwCurrentState=SERVICE_START_PENDING;
status.dwControlsAccepted=SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
status.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
SetServiceStatus(statusHanle,&status);
status.dwCurrentState=SERVICE_RUNNING;
status.dwControlsAccepted=
SetServiceStatus(statusHanle,&status);
FILE* file;
int i=0;
file=fopen("C:\\abc.txt","a+");
while(i<1000)
{
fputs("sfdf\r\n",file);
Sleep(3000);
}


fclose(file);
status.dwCurrentState=SERVICE_STOP;
SetServiceStatus(statusHanle,&status);

}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
TCHAR szFile[1024];
dwID=GetCurrentProcessId();
SERVICE_TABLE_ENTRY entry[]={{_T("MyService"),(LPSERVICE_MAIN_FUNCTION)ServiceMain},{NULL,NULL}};
if(_tcscmp(lpCmdLine,_T("/install"))==0)
{
::GetModuleFileName(NULL,szFile,1024);
scmHandle=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
serviceHandle=CreateService(scmHandle,_T("MyService"),_T("MyService"),SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,szFile,NULL,NULL,_T(""),NULL,NULL);

dw=GetLastError();

}
else
{

if(!StartServiceCtrlDispatcher(entry))
{
MessageBox(NULL,_T("服务主函数注册失败了"),_T("消息"),MB_OK);
}
}

return 0;
}
...全文
195 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-10-14
  • 打赏
  • 举报
回复
status.dwControlsAccepted中没有包含SERVICE_ACCEPT_PAUSE_CONTINUE标志。
SERVICE_CONTROL_STOP响应中没有设置SERVICE_STOPPED状态。
WinEggDrop 2008-10-14
  • 打赏
  • 举报
回复
不能停止可能性是:
1.程序本身并没有处理服务"停止".
2.服务还处于"SERVICE_STRAT_PENDING"状态(也就是服务还处于启动中,还没有成功启动,自然无法停止").

你先弄清楚服务是否已经成功启动.
palmax 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 paerxiushi 的帖子:]
在调用CreateService的时候,明明指定了SERVICE_ALL_ACCESS的服务权限,为什么在服务管理器中,那个服务的右键菜单是灰色,而且停止了之后就会报错:
....
void ServiceMain(...)
status.dwCurrentState=SERVICE_START_PENDING;
status.dwControlsAccepted=SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
status.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
SetServiceStatus(statusHanle,&status);
status.dwCurrentState=SERVICE_RUNNING;
status.dwControlsAccepted= // 这一行你怎么没设置?
SetServiceStatus(statusHanle,&status);
[/Quote]

编译时就没警告吗?
microyzy 2008-10-14
  • 打赏
  • 举报
回复
ServiceMain是服务启动的主函数,它执行完之后,服务的状态应该被设置成RUNNING,你最后好像设置成STOP了,这样的结果,应该是每次启动服务,windows会告诉你服务启动了,但不知道为什么又停止了,呵呵,记得不太清楚了,请看下系统的log

处理STOP的handler里,存在case STOP的时候,最后的状态应该是STOP,而不是PENDING

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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