C++ Windows服务安装返回错误1053
我已经创建了一个Http服务器(C++WIN32控制台应用程序),我想运行它的is服务。 此服务器有主线程和侦听器线程,它们将侦听传入的流量。主线程将永远阻塞 我已经创建了一个NSIS安装程序,它使用插件来安装和运行服务器C++ Windows服务安装返回错误1053,c++,winapi,windows-services,nsis,C++,Winapi,Windows Services,Nsis,我已经创建了一个Http服务器(C++WIN32控制台应用程序),我想运行它的is服务。 此服务器有主线程和侦听器线程,它们将侦听传入的流量。主线程将永远阻塞 我已经创建了一个NSIS安装程序,它使用插件来安装和运行服务器 SimpleSC::InstallService "HttpServer" "HttpServer" "16" "2" "$INSTDIR\Server.exe" "" "" "" SimpleSC::StartService "HttpServer" "" 30 我可以
SimpleSC::InstallService "HttpServer" "HttpServer" "16" "2" "$INSTDIR\Server.exe" "" "" ""
SimpleSC::StartService "HttpServer" "" 30
我可以安装服务,但它没有启动并返回1053错误。这是因为主线程阻塞吗?请在这方面帮助我。问题一定出在您的服务代码中。在调用
RegisterServiceCtrlHandler()
时声明的服务控制处理程序中,需要处理几种请求类型,并根据反馈返回给系统服务管理器。它让系统知道您的服务是否正常工作以及当前状态如何
如果您没有回答所有请求类型(特别是服务_控制_询问
),或者如果您没有在有限的时间内回答,系统将推断您的服务已失败/暂停
这是我在代码中使用的控件处理程序示例:
//Feedback() is a custom function to put log into the system events and / or OutputDebugString()
//mSrvStatus is a global SERVICE_STATUS
void WINAPI SrvControlHandler(DWORD Opcode) {
DWORD state;
switch (Opcode) {
case SERVICE_CONTROL_PAUSE:
Feedback(FEED_EVENTS|FEED_ODS, "Pausing %s", SRVNAME);
bActive = false;
state = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
//refresh our settings from registry before continuing
GetRegistrySettings();
Feedback(FEED_EVENTS|FEED_ODS, "Continuing %s with refresh=%d", SRVNAME, dwRefresh);
bActive = true;
state = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
Feedback(FEED_EVENTS|FEED_ODS, "Stopping %s", SRVNAME);
ReportSrvStatus(SERVICE_STOP_PENDING, NO_ERROR, 0); //ok, we begin to stop
//The final ReportSrvStatus(SERVICE_STOPPED, NO_ERROR, 0);
//is sent from the function that started the service
//that is waiting forever on the hSrvStopEvt event
bActive = false; //we tell the thread to stop fetching
SetEvent(hSrvStopEvt); //and we signal the final event
return;
break;
case SERVICE_CONTROL_INTERROGATE:
state = mSrvStatus.dwCurrentState;
Feedback(FEED_ODS, "%s interrogated by SCM, returned %d", SRVNAME, state);
break;
default:
Feedback(FEED_ODS, "other control resquest ?? - %d", Opcode);
state = mSrvStatus.dwCurrentState;
}
ReportSrvStatus(state, NO_ERROR, 0);
}
/* Sets the current service status and reports it to the SCM.
Parameters:
dwCurrentState - The current state (see SERVICE_STATUS)
dwWin32ExitCode - The system error code
dwWaitHint - Estimated time for pending operation, in milliseconds
*/
void ReportSrvStatus( DWORD dwCurrentState,
DWORD dwWin32ExitCode,
DWORD dwWaitHint) {
static DWORD dwCheckPoint = 1;
mSrvStatus.dwCurrentState = dwCurrentState;
mSrvStatus.dwWin32ExitCode = dwWin32ExitCode;
mSrvStatus.dwWaitHint = dwWaitHint;
if (dwCurrentState == SERVICE_START_PENDING)
mSrvStatus.dwControlsAccepted = 0;
else mSrvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE|SERVICE_ACCEPT_SHUTDOWN;
if ( (dwCurrentState == SERVICE_RUNNING) ||
(dwCurrentState == SERVICE_STOPPED) )
mSrvStatus.dwCheckPoint = 0;
else mSrvStatus.dwCheckPoint = dwCheckPoint++;
SetServiceStatus( hSrvStatus, &mSrvStatus );
}
尝试在命令提示符下使用“net start HttpServer”(如果上面的XP是管理模式)。@Abhineet我这样做了,我可以在service.msc中看到它显示为启动,然后熄灭。“服务没有响应控制功能”然后您必须查看服务创建代码。它如何处理控件的传递以及它接受哪些控件。检查您的服务通过以下方式接受的控件::“sc query HttpServer”-此cmd将显示您的服务的详细信息。在“状态”下,它显示控件。让我检查我的代码。我将检查我的代码中缺少的内容code@Chris_vr:请随时询问任何信息。我无法发布全部代码,但如果需要,我可以发布更多信息/摘录。