windows服务编程,无法启动问题1053,请帮忙,代码已贴出

robinmumu 2011-07-04 02:43:05
程序可以正常安装服务,但始终无法启动
提示服务错误1053:服务没有及时响应启动或控制请求
谁知道是怎么回事吗




#include <windows.h>
#include <winsvc.h>
#include <iostream>

void ShowErr(char* perror);
void ServiceMain(DWORD argc, LPTSTR *argv);
void ServiceCtrlHandler(DWORD nControlCode);
BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,
DWORD dwWaitHint);
BOOL StartServiceThread();
DWORD ServiceExecutionThread(LPDWORD param);
HANDLE hServiceThread;
void KillService();

char *strServiceName = "aaa";
SERVICE_STATUS_HANDLE nServiceStatusHandle;
HANDLE killServiceEvent;
BOOL nServiceRunning;
DWORD nServiceCurrentStatus;

int InstallService();
int StartStopService(int nflag);
int ExecuteService();


int main(int argc, char* argv[])
{
if(argc<2)
{
printf("Usage:- StartStopService install|starting|stop|exe\r\n");
return 1;
}

if(strcmp(argv[1],"install")==0)
{
InstallService();
}

if(strcmp(argv[1],"starting")==0)
{
StartStopService(1);
}

if(strcmp(argv[1],"stoping")==0)
{
StartStopService(2);
}

if(strcmp(argv[1],"exe")==0)
{
ExecuteService();
}


return 0;
}

void ShowErr(char* perror)
{
printf(perror);
}

int InstallService()
{
printf("InstallService\r\n");
TCHAR szPath[MAX_PATH];

if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )
{
printf("Cannot install service (%d)\n", GetLastError());
return 1;
}

SC_HANDLE NishService,scm;
scm=OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
if(!scm)
{
ShowErr("OpenSCManager Error\r\n");
return 1;
}
NishService=CreateService(scm,strServiceName,
strServiceName,
SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,//,SERVICE_AUTO_START
SERVICE_ERROR_NORMAL,
szPath,
NULL, NULL, "", NULL, NULL);
if(!NishService)
{
CloseServiceHandle(scm);
ShowErr("CreateService Error\r\n");
return 1;
}
CloseServiceHandle(NishService);
CloseServiceHandle(scm);
return 0;
}

int StartStopService(int nflag)// flag 1 start 2 stop
{
printf("StartStopService\r\n");

SC_HANDLE NishService,scm;
scm=OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
if(!scm)
{
ShowErr("OpenSCManager Error\r\n");
return 1;
}
NishService=OpenService(scm,strServiceName,SERVICE_ALL_ACCESS);
if(!NishService)
{
CloseServiceHandle(scm);
ShowErr("OpenService Error\r\n");
return 1;
}
if(nflag==1)
{
printf("starting...\r\n");
BOOL blnret = StartService(NishService,0,NULL);
if(!blnret)
{
printf("StartService Error(%d)\n", GetLastError());
}
}
if(nflag==2)
{
printf("stopping...\r\n");
SERVICE_STATUS m_SERVICE_STATUS;
ControlService(NishService,SERVICE_CONTROL_STOP,&m_SERVICE_STATUS);
}

CloseServiceHandle(NishService);
CloseServiceHandle(scm);
return 0;
}

int ExecuteService()
{
printf("ExecuteService\r\n");

SERVICE_TABLE_ENTRY servicetable[]=
{
{strServiceName,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
{NULL,NULL}
};
BOOL success;
success=StartServiceCtrlDispatcher(servicetable);
if(!success)
{
//error occured
}
return 0;
}


void ServiceMain(DWORD argc, LPTSTR *argv)
{
BOOL success;
nServiceStatusHandle=RegisterServiceCtrlHandler(strServiceName,
(LPHANDLER_FUNCTION)ServiceCtrlHandler);
if(!nServiceStatusHandle)
{
printf("RegisterServiceCtrlHandler Error\r\n");
return;
}
success=UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,1,3000);
if(!success)
{
printf("UpdateServiceStatus 1 Error\r\n");
return;
}
killServiceEvent=CreateEvent(0,TRUE,FALSE,0);
if(killServiceEvent==NULL)
{
printf("CreateEvent Error\r\n");
return;
}
success=UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,2,1000);
if(!success)
{
printf("SERVICE_START_PENDING 2 Error\r\n");
return;
}
success=StartServiceThread();
if(!success)
{
printf("StartServiceThread Error\r\n");
return;
}
nServiceCurrentStatus=SERVICE_RUNNING;
success=UpdateServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0);
if(!success)
{
printf("UpdateServiceStatus 0 Error\r\n");
return;
}
WaitForSingleObject(killServiceEvent,INFINITE);
CloseHandle(killServiceEvent);
}



BOOL UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,
DWORD dwWaitHint)
{
BOOL success;
SERVICE_STATUS nServiceStatus;
nServiceStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
nServiceStatus.dwCurrentState=dwCurrentState;
if(dwCurrentState==SERVICE_START_PENDING)
{
nServiceStatus.dwControlsAccepted=0;
}
else
{
nServiceStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP
|SERVICE_ACCEPT_SHUTDOWN;
}
if(dwServiceSpecificExitCode==0)
{
nServiceStatus.dwWin32ExitCode=dwWin32ExitCode;
}
else
{
nServiceStatus.dwWin32ExitCode=ERROR_SERVICE_SPECIFIC_ERROR;
}
nServiceStatus.dwServiceSpecificExitCode=dwServiceSpecificExitCode;
nServiceStatus.dwCheckPoint=dwCheckPoint;
nServiceStatus.dwWaitHint=dwWaitHint;

success=SetServiceStatus(nServiceStatusHandle,&nServiceStatus);

if(!success)
{
KillService();
return success;
}
else
return success;
}

BOOL StartServiceThread()
{
DWORD id;
hServiceThread=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)ServiceExecutionThread,
0,0,&id);
if(hServiceThread==0)
{
return false;
}
else
{
nServiceRunning=true;
return true;
}
}

DWORD ServiceExecutionThread(LPDWORD param)
{
while(nServiceRunning)
{
MessageBox(NULL,"run","tip",MB_OK);
Beep(450,150);
Sleep(1000);
}
return 0;
}

void KillService()
{
nServiceRunning=false;
SetEvent(killServiceEvent);
UpdateServiceStatus(SERVICE_STOPPED,NO_ERROR,0,0,0);
}

void ServiceCtrlHandler(DWORD nControlCode)
{
BOOL success;
switch(nControlCode)
{
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
nServiceCurrentStatus=SERVICE_STOP_PENDING;
success=UpdateServiceStatus(SERVICE_STOP_PENDING,NO_ERROR,0,1,3000);
KillService();
return;
default:
break;
}
UpdateServiceStatus(nServiceCurrentStatus,NO_ERROR,0,0,0);
}
...全文
767 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
不二星空 2011-07-05
  • 打赏
  • 举报
回复
先断点查看服务中可执行程序路径对不对?
然后看是哪一个函数调用出错了
cnzdgs 2011-07-04
  • 打赏
  • 举报
回复
InstallService函数中,GetModuleFileName得到文件名及路径,但你没有加上exe参数。
robinmumu 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oyljerry 的回复:]
StartServiceCtrlDispatcher
后面,GetLastError查看一下错误信息.
[/Quote]

如果执行starting,则出现startservice error1053
如果执行exe,则出现StartServiceCtrlDispatcher error1063
robinmumu 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fangchao918628 的回复:]
程序里有MessageBox
你在创建的服务属性->登录->选中允许服务与桌面交互 试下.....
[/Quote]

把MessageBox去掉效果是一样的
如果执行starting,则出现startservice error1053
如果执行exe,则出现StartServiceCtrlDispatcher error1063
oyljerry 2011-07-04
  • 打赏
  • 举报
回复
StartServiceCtrlDispatcher
后面,GetLastError查看一下错误信息.
fangchao918628 2011-07-04
  • 打赏
  • 举报
回复
程序里有MessageBox
你在创建的服务属性->登录->选中允许服务与桌面交互 试下.....
向立天 2011-07-04
  • 打赏
  • 举报
回复
你什么系统
会不会是权限问题
robinmumu 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dfasri 的回复:]
写个Sleep在ServMain那里, 采用VC的动态DEBUG方式, Attach过去进行跟踪一下代码. 这个错误一般是在起动时就退出了导致的.

你的ServMain那里有很多个Return, 打个LOG出来看看是在哪里跳出的应该会比较容易得到问题所在.
[/Quote]

根本都没有执行到servmain。。
如果执行starting,则出现startservice error1053
如果执行exe,则出现StartServiceCtrlDispatcher error1063
dfasri 2011-07-04
  • 打赏
  • 举报
回复
写个Sleep在ServMain那里, 采用VC的动态DEBUG方式, Attach过去进行跟踪一下代码. 这个错误一般是在起动时就退出了导致的.

你的ServMain那里有很多个Return, 打个LOG出来看看是在哪里跳出的应该会比较容易得到问题所在.

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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