为了账号安全,请及时绑定邮箱和手机立即绑定

我把服务主程序的代码贴出来,求指导://服务入口点函数

我把服务主程序的代码贴出来,求指导://服务入口点函数

慕妹3146593 2022-11-04 17:13:00
void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv){//初始化 SERVICE_STATUS 结构中的成员ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;ssStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP;ssStatus.dwCurrentState= SERVICE_STOPPED;ssStatus.dwServiceSpecificExitCode=0;ssStatus.dwCheckPoint=0;ssStatus.dwWin32ExitCode=0;ssStatus.dwWaitHint=0;//注册服务控制处理函数sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl);//如果注册失败if(!sshStatusHandle){goto cleanup;return;}//更新服务状态if(!ReportStatusToSCMgr(SERVICE_START_PENDING,//服务状态,The service is starting.NO_ERROR, //退出码3000)) //等待时间goto cleanup; //更新服务状态失败则转向 cleanupServiceStart(dwArgc,lpszArgv);//具体的服务程序return;cleanup://把服务状态更新为 SERVICE_STOPPED,并退出。if(sshStatusHandle)(void)ReportStatusToSCMgr(SERVICE_STOPPED,dwErr,0);}请问哪里不对呢???
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

// NT服务程序的入口函数
void WINAPI ServiceMain(DWORD argc, LPSTR *argv)
{
//DWORD status;
//DWORD specificError;
// 注册服务控制
SKServer*NTSObj;
NTSObj = (SKServer *)SKServerID;
ServiceStatusHandle = RegisterServiceCtrlHandlerA(NTSObj->NTSName, ServiceCtrlHandler);
ServiceStatus.dwServiceType= SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState= SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted= SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode= 0;
ServiceStatus.dwServiceSpecificExitCode= 0;
ServiceStatus.dwCheckPoint= 0;
ServiceStatus.dwWaitHint= 0;
SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
if(NTSObj->OnStart!=NULL){
NTSObj->OnStart();
}
ServiceStatus.dwCurrentState= SERVICE_RUNNING;
SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
NTSObj->IsExit = FALSE;
while(!NTSObj->IsExit){
Sleep(100);
}
return;
}
// NT服务程序的服务控制处理函数
void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
SKServer*NTSObj;
NTSObj = (SKServer *)SKServerID;
switch(Opcode){
case SERVICE_CONTROL_PAUSE:
if(NTSObj->OnPause!=NULL){
NTSObj->OnPause();
}
ServiceStatus.dwCurrentState = SERVICE_PAUSED;
SetServiceStatus(ServiceStatusHandle,&ServiceStatus);
break;

case SERVICE_CONTROL_CONTINUE:
if(NTSObj->OnStart!=NULL){
NTSObj->OnStart();
}
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(ServiceStatusHandle,&ServiceStatus);
break;

case SERVICE_CONTROL_STOP:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
SetServiceStatus (ServiceStatusHandle,&ServiceStatus);
if(NTSObj->OnStop!=NULL){
NTSObj->OnStop();
}
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(ServiceStatusHandle,&ServiceStatus);
NTSObj->IsExit=TRUE;
break;

case SERVICE_CONTROL_INTERROGATE:
break;
}
return;
}


查看完整回答
反对 回复 2022-11-08
?
MYYA

TA贡献1868条经验 获得超4个赞

这个问题好复杂。
我也试过错误1053,后来发现是因为dll的路径放错了。因为系统服务的工作路径在system32。

查看完整回答
反对 回复 2022-11-08
  • 2 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信