【问题标题】:How to get the status of a service programmatically (Running/Stopped)如何以编程方式获取服务的状态(运行/停止)
【发布时间】:2011-10-18 13:36:05
【问题描述】:

我需要在我的 C++ 应用程序中获取 Windows“打印后台处理程序”服务的状态。

【问题讨论】:

标签: c++ visual-c++ windows-services


【解决方案1】:

@shikarssj 提供的功能完美运行,加载服务时只需要管理员权限。

这是一个不需要完全许可的版本:

#include <Windows.h>

int GetServiceStatus( const char* name )
{
    SC_HANDLE theService, scm;
    SERVICE_STATUS m_SERVICE_STATUS;
    SERVICE_STATUS_PROCESS ssStatus;
    DWORD dwBytesNeeded;


    scm = OpenSCManager( nullptr, nullptr, SC_MANAGER_ENUMERATE_SERVICE );
    if( !scm ) {
        return 0;
    }

    theService = OpenService( scm, name, SERVICE_QUERY_STATUS );
    if( !theService ) {
        CloseServiceHandle( scm );
        return 0;
    }

    auto result = QueryServiceStatusEx( theService, SC_STATUS_PROCESS_INFO,
        reinterpret_cast<LPBYTE>( &ssStatus ), sizeof( SERVICE_STATUS_PROCESS ),
        &dwBytesNeeded );

    CloseServiceHandle( theService );
    CloseServiceHandle( scm );

    if( result == 0 ) {
        return 0;
    }

    return ssStatus.dwCurrentState;
}

【讨论】:

    【解决方案2】:

    我找不到任何使用 WinApi 和 C++ 的好例子。我尝试并编译了以下内容,它在 Borland 中工作。希望这对某人有所帮助。

    int getServiceStatus(char* name) 
    {
       SC_HANDLE theService,scm;
       SERVICE_STATUS m_SERVICE_STATUS;
       SERVICE_STATUS_PROCESS ssStatus;
       DWORD dwBytesNeeded;
    
       scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
       if (!scm) {
         ShowErr();
         return 0;
       }
    
    
       theService = OpenService(scm, name, SERVICE_ALL_ACCESS);
       if (!theService) {
         CloseServiceHandle(scm);
         ShowErr();
         return 0;
       }
    
       int result = QueryServiceStatusEx(theService, SC_STATUS_PROCESS_INFO, (LPBYTE)       
                                       &ssStatus, sizeof(SERVICE_STATUS_PROCESS), 
                                       &dwBytesNeeded);
    
    CloseServiceHandle(theService);
    CloseServiceHandle(scm);
    
    if (result == 0) return 0; // fail query status
    
    return ssStatus.dwCurrentState;
    

    }

    【讨论】:

      【解决方案3】:

      使用QueryServiceStatusQueryServiceStatusEx。网络上有很多关于如何使用它们的示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多