读书人

关于windows服务启动的有关问题,请问

发布时间: 2012-03-12 12:45:33 作者: rapoo

关于windows服务启动的问题,请教

C/C++ code
void Help(){         printf("\t-install    安装windows服务\n");    printf("\t-uninstall  删除windows服务\n");    printf("\t-start      启动windows服务\n");    printf("\t-stop       停止windows服务\n");}int main( int argc, char* argv[] ){    Init();    dwThreadID = ::GetCurrentThreadId();    SERVICE_TABLE_ENTRY st[] =    {        { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },        { NULL, NULL }    };    LPSTR lpCmdLine = argv[1];    if ( argc == 2 )    {        BOOL bRet;        if (stricmp(lpCmdLine, "-install") == 0)        {            bRet = InstallService();            if ( bRet == TRUE )            {                Log( "Install service %s success", szServiceName );            }else            {                Log( "Install service %s failed", szServiceName );            }        }        else if (stricmp(lpCmdLine, "-uninstall") == 0)        {            bRet = UninstallService();            if ( bRet == TRUE )            {                Log( "Uninstall service %s success", szServiceName);            }else            {                Log( "Uninstall service %s failed[%d]", szServiceName,GetLastError());            }        }else if (stricmp(lpCmdLine, "-start") == 0)        {            bRet = ServiceCtrlStart();            if ( bRet == TRUE )            {                Log( "Start service %s success", szServiceName );            }else            {                Log( "Start service %s failed[%d]", szServiceName,GetLastError());            }        }else if (stricmp(lpCmdLine, "-stop") == 0)        {            bRet = ServiceCtrlStop();            if ( bRet == TRUE )            {                Log( "Stop service %s success", szServiceName );            }else            {                Log( "Stop service %s failed[%d]", szServiceName,GetLastError());            }        }        else        {            Help();        }    }else    {        if (!::StartServiceCtrlDispatcher(st))        {                        Help();        }    }    return 0;}//初始化相关结构void Init(){    hServiceStatus = NULL;    status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;    status.dwCurrentState = SERVICE_STOPPED;    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;    status.dwWin32ExitCode = 0;    status.dwServiceSpecificExitCode = 0;    status.dwCheckPoint = 0;    status.dwWaitHint = 0;}//服务主线程函数,既用户选择开启服务时调用的函数void WINAPI ServiceMain(){    // Register the control request handler    status.dwCurrentState = SERVICE_START_PENDING;    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;        Log(_T("ServiceMain"));    //注册服务控制    hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);    if (hServiceStatus == NULL)    {        Log(_T("Handler not installed"));        return;    }    SetServiceStatus(hServiceStatus, &status);    ////如下代码可以为启动服务前的准备工作    hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );    if ( hEvent == NULL )    {        status.dwCurrentState = SERVICE_STOPPED;        SetServiceStatus(hServiceStatus, &status);        Log(_T("Failure to start service[%d]"),GetLastError());        return;    }    //更改服务状态为启动    status.dwWin32ExitCode = S_OK;    status.dwCheckPoint = 0;    status.dwWaitHint = 0;    status.dwCurrentState = SERVICE_RUNNING;    SetServiceStatus(hServiceStatus, &status);    //等待用户选择停止服务,    //当然你也可以把你的服务代码用线程来执行,    //此时这里只需等待线程结束既可。    while ( WaitForSingleObject( hEvent, 1000 ) != WAIT_OBJECT_0 )    {        //模拟服务的运行,应用时将主要任务放于此即可        Log(_T("Service runing..."));        WorkFun();    }        //停止服务    status.dwCurrentState = SERVICE_STOPPED;    SetServiceStatus(hServiceStatus, &status);    Log(_T("Service stopped"));}//服务控制函数void WINAPI ServiceStrl(DWORD dwOpcode){    switch (dwOpcode)    {    case SERVICE_CONTROL_STOP:        status.dwCurrentState = SERVICE_STOP_PENDING;        SetServiceStatus(hServiceStatus, &status);        //告诉服务线程停止工作        ::SetEvent( hEvent );        Log(_T("want to stopped Service"));        break;    case SERVICE_CONTROL_PAUSE:        break;    case SERVICE_CONTROL_CONTINUE:        break;    case SERVICE_CONTROL_INTERROGATE:        break;    case SERVICE_CONTROL_SHUTDOWN:        break;    default:        Log(_T("Bad service request"));    }}//判断服务是否已安装BOOL IsServiceInstalled(){    BOOL bResult = FALSE;    //打开服务控制管理器    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);    if (hSCM != NULL)    {        //打开服务        SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);        if (hService != NULL)        {            bResult = TRUE;            ::CloseServiceHandle(hService);        }        ::CloseServiceHandle(hSCM);    }    return bResult;}//安装服务BOOL InstallService(){    if (IsServiceInstalled())        return TRUE;    //打开服务控制管理器    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);    if (hSCM == NULL)    {        return FALSE;    }    // Get the executable file path    TCHAR szFilePath[MAX_PATH];    ::GetModuleFileName(NULL, szFilePath, MAX_PATH);    //创建服务    SC_HANDLE hService = ::CreateService(        hSCM,        szServiceName,        szServiceName,        SERVICE_ALL_ACCESS,        SERVICE_WIN32_OWN_PROCESS,        SERVICE_AUTO_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动        SERVICE_ERROR_NORMAL,        szFilePath,        NULL,        NULL,        _T(""),        NULL,        NULL);    if (hService == NULL)    {        ::CloseServiceHandle(hSCM);        return FALSE;    }    ::CloseServiceHandle(hService);    ::CloseServiceHandle(hSCM);    return TRUE;}//删除服务BOOL UninstallService(){    if (!IsServiceInstalled())        return TRUE;    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);    if (hSCM == NULL)    {        return FALSE;    }    SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);    if (hService == NULL)    {        ::CloseServiceHandle(hSCM);        return FALSE;    }    SERVICE_STATUS status;    ::ControlService(hService, SERVICE_CONTROL_STOP, &status);    //删除服务    BOOL bDelete = ::DeleteService(hService);    ::CloseServiceHandle(hService);    ::CloseServiceHandle(hSCM);    if (bDelete)        return TRUE;    Log(_T("Service could not be deleted[%d]"),GetLastError());    return FALSE;}//开启服务BOOL ServiceCtrlStart(){    BOOL bRet;    SC_HANDLE hSCM;    SC_HANDLE hService;    hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);    if (hSCM!=NULL)    {        hService=OpenService( hSCM, szServiceName, SERVICE_START);        if (hService!=NULL)        {            //开始Service            bRet = StartService(hService,0,NULL);            CloseServiceHandle(hService);        }else        {            bRet = FALSE;        }        CloseServiceHandle(hSCM);    }else    {        bRet = FALSE;    }    return bRet;}//停止服务BOOL ServiceCtrlStop(){    BOOL bRet;    SC_HANDLE hSCM;    SC_HANDLE hService;    SERVICE_STATUS ServiceStatus;    hSCM=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );    if (hSCM!=NULL)    {        hService=OpenService( hSCM, szServiceName, SERVICE_STOP|SERVICE_QUERY_STATUS );        if (hService!=NULL)        {            QueryServiceStatus( hService, &ServiceStatus );            if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)            {                bRet = ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus );            }else            {                bRet = FALSE;            }            CloseServiceHandle( hService );        }else        {            bRet = FALSE;        }        CloseServiceHandle( hSCM );    }else    {        bRet = FALSE;    }    return bRet;}int WorkFun(){       //workiing    return 0;} 



这个是我的服务器自启动的代码,有安装服务,启动服务,停止服务,和卸载服务的功能,这些功能都是好的,但是停止服务的时候,服务所启动的进程不会停止,为什么?我的代码哪里有什么问题,代码有点多,不好意思啊

[解决办法]
在OpenService的权限中加入SERVICE_ALL_ACCESS看看是否可以
[解决办法]
探讨
怎么都没人帮我呢?再来人帮我看看啊,我不知道哪里有什么问题

[解决办法]
探讨
引用:
引用:
怎么都没人帮我呢?再来人帮我看看啊,我不知道哪里有什么问题

停止服务的时候,你的代码跑到哪里,在哪阻塞了,自己添加Log分析一下


如果我的WorkFun里面有个while(1)死循环的执行某个事情的话,会不会导致这个问题?

读书人网 >VC/MFC

热点推荐