windows 服务的安装、启动、状态查询 c++实现


#ifndef __SERVICEMANAGE_H__
#define __SERVICEMANAGE_H__
#include <windows.h>
#include <string>
class ServerManage
{
public:
    ServerManage() {}
    ~ServerManage() {}
    /*
    @ 根据服务名启动服务
    */
    inline bool Start_Server(const std::string& strServiceName)
    {
        bool bResult = false;
        if (strServiceName.empty())
        {
            return bResult;
        }
        SC_HANDLE sc_Manager = ::OpenSCManagerA(NULL, NULL, GENERIC_EXECUTE);
        if (sc_Manager)
        {
            SC_HANDLE sc_service = ::OpenServiceA(sc_Manager, strServiceName.c_str(), SERVICE_ALL_ACCESS);
            if (sc_service)
            {
                SERVICE_STATUS_PROCESS service_status;
                ZeroMemory(&service_status, sizeof(SERVICE_STATUS_PROCESS));
                DWORD dwpcbBytesNeeded = sizeof(SERVICE_STATUS_PROCESS);
                if (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                    (LPBYTE)&service_status,
                    dwpcbBytesNeeded,
                    &dwpcbBytesNeeded))
                {
                    if (service_status.dwCurrentState == SERVICE_STOPPED)
                    {
                        if (!::StartService(sc_service, NULL, NULL))
                        {
                            ::CloseServiceHandle(sc_service);
                            ::CloseServiceHandle(sc_Manager);
                            return bResult;
                        }
                        while (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                            (LPBYTE)&service_status,
                            dwpcbBytesNeeded,
                            &dwpcbBytesNeeded))
                        {
                            Sleep(service_status.dwWaitHint);
                            if (service_status.dwCurrentState == SERVICE_RUNNING)
                            {
                                bResult = true;
                                break;
                            }
                        }
                    }
                }
                ::CloseServiceHandle(sc_service);
            }
            ::CloseServiceHandle(sc_Manager);
        }
        return bResult;
    }
    /*
    @根据服务名停止服务
    */
    inline bool Stop_Server(const std::string& strServiceName)
    {
        bool bResult = false;
        if (strServiceName.empty())
        {
            return bResult;
        }
        SC_HANDLE sc_Manager = ::OpenSCManagerA(NULL, NULL, GENERIC_EXECUTE);
        if (sc_Manager)
        {
            SC_HANDLE sc_service = ::OpenServiceA(sc_Manager, strServiceName.c_str(), SERVICE_ALL_ACCESS);
            if (sc_service)
            {
                SERVICE_STATUS_PROCESS service_status;
                ZeroMemory(&service_status, sizeof(SERVICE_STATUS_PROCESS));
                DWORD dwpcbBytesNeeded = sizeof(SERVICE_STATUS_PROCESS);
                if (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                    (LPBYTE)&service_status,
                    dwpcbBytesNeeded,
                    &dwpcbBytesNeeded))
                {
                    SERVICE_CONTROL_STATUS_REASON_PARAMSA service_control_status;
                    DWORD dwerror = NULL;
                    ZeroMemory(&service_control_status, sizeof(SERVICE_CONTROL_STATUS_REASON_PARAMSA));
                    if (service_status.dwCurrentState == SERVICE_RUNNING)
                    {
                        service_control_status.dwReason = SERVICE_STOP_REASON_FLAG_PLANNED | SERVICE_STOP_REASON_MAJOR_APPLICATION | SERVICE_STOP_REASON_MINOR_NONE;;
                        if (!::ControlServiceExA(sc_service, SERVICE_CONTROL_STOP, SERVICE_CONTROL_STATUS_REASON_INFO, &service_control_status))
                        {
                            dwerror = ::GetLastError();
                            ::CloseServiceHandle(sc_service);
                            ::CloseServiceHandle(sc_Manager);
                            return bResult;
                        }
                        while (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                            (LPBYTE)&service_status,
                            dwpcbBytesNeeded,
                            &dwpcbBytesNeeded))
                        {
                            Sleep(service_status.dwWaitHint);
                            if (service_status.dwCurrentState == SERVICE_STOPPED)
                            {

                                bResult = true;
                                break;
                            }
                        }
                    }
                }
                ::CloseServiceHandle(sc_service);
            }
            ::CloseServiceHandle(sc_Manager);
        }
        return bResult;
    }
    /*
    @根据服务名查询服务状态
    */
    inline DWORD Query_Server_Status(const std::string& strServiceName)
    {
        DWORD nResult = 0;
        if (strServiceName.empty())
        {
            return nResult;
        }
        SC_HANDLE sc_Manager = ::OpenSCManagerA(NULL, NULL, GENERIC_EXECUTE);
        if (sc_Manager)
        {
            SC_HANDLE sc_service = ::OpenServiceA(sc_Manager, strServiceName.c_str(), SERVICE_ALL_ACCESS);
            if (sc_service)
            {
                SERVICE_STATUS_PROCESS service_status;
                ZeroMemory(&service_status, sizeof(SERVICE_STATUS_PROCESS));
                DWORD dwpcbBytesNeeded = sizeof(SERVICE_STATUS_PROCESS);
                if (::QueryServiceStatusEx(sc_service, SC_STATUS_PROCESS_INFO,
                    (LPBYTE)&service_status,
                    dwpcbBytesNeeded,
                    &dwpcbBytesNeeded))
                {
                    nResult = service_status.dwCurrentState;
                }
                ::CloseServiceHandle(sc_service);
            }
            ::CloseServiceHandle(sc_Manager);
        }
        return nResult;
    }
    /*
    @ 根据服务名 安装服务
    */
    inline bool SerivceInstall(const std::string& strServiceName) {
        bool bResult = false;
        SC_HANDLE schSCManger;
        SC_HANDLE schService;
        CHAR szPath[MAX_PATH];
        ZeroMemory(&szPath, MAX_PATH);
        if (!::GetModuleFileNameA(NULL, szPath, MAX_PATH)) {
            //LOG_INFO << "不能安装服务 (" << ::GetLastError() << ")\r\n";
            return;
        }
        //获取SCM数据库的句柄。
        schSCManger = ::OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if (!schSCManger) {
            //LOG_INFO << "打开服务管理器失败 (" << ::GetLastError() << ")\r\n";
            return;
        }
        //创建服务
        schService = ::CreateServiceA(schSCManger, strServiceName.c_str(),
            strServiceName.c_str(),
            SERVICE_ALL_ACCESS,
            SERVICE_WIN32_OWN_PROCESS,
            SERVICE_AUTO_START,
            SERVICE_ERROR_NORMAL,
            szPath,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL);
        if (!schService)
        {
            //LOG_INFO << "创建服务失败 (" << ::GetLastError() << ")\r\n";
            ::CloseServiceHandle(schSCManger);
            return bResult;
        }
        else
        {
            //LOG_INFO << "创建服务成功\r\n";
            //::StartService(schService, NULL, NULL);
            bResult = true;
        }

        ::CloseServiceHandle(schService);
        ::CloseServiceHandle(schSCManger);
        return bResult;
    }
private:

};
#endif  //__SERVICEMANAGE_H__
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++可以用来编写Windows服务。下面是一个简单的示例代码,演示了如何使用C++编写一个Windows服务: ```cpp #include <windows.h> // 服务主函数 void ServiceMain(int argc, char* argv[]); // 服务控制处理函数 void ServiceCtrlHandler(DWORD ctrlCode); // 入口函数 int main() { // 定义服务表 SERVICE_TABLE_ENTRY serviceTable[] = { { "MyService", (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; // 启动服务控制管理器 if (!StartServiceCtrlDispatcher(serviceTable)) { // 处理错误 // ... } return 0; } void ServiceMain(int argc, char* argv[]) { // 注册服务控制处理函数 SERVICE_STATUS_HANDLE serviceStatusHandle = RegisterServiceCtrlHandler("MyService", (LPHANDLER_FUNCTION)ServiceCtrlHandler); // 设置服务状态 SERVICE_STATUS serviceStatus; serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; serviceStatus.dwCurrentState = SERVICE_RUNNING; serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; serviceStatus.dwWin32ExitCode = 0; serviceStatus.dwServiceSpecificExitCode = 0; serviceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; SetServiceStatus(serviceStatusHandle, &serviceStatus); // 执行服务逻辑 while (serviceStatus.dwCurrentState == SERVICE_RUNNING) { // 服务逻辑 // ... } // 设置服务停止状态 serviceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(serviceStatusHandle, &serviceStatus); } void ServiceCtrlHandler(DWORD ctrlCode) { // 处理服务控制指令 switch (ctrlCode) { case SERVICE_CONTROL_STOP: // 停止服务 // ... break; } } ``` 这段代码定义了一个名为"MyService"的服务,它的主函数是`ServiceMain`,服务控制处理函数是`ServiceCtrlHandler`。在`ServiceMain`函数中,你可以编写你的服务逻辑。在`ServiceCtrlHandler`函数中,你可以处理服务控制指令,例如停止服务。 请注意,编写Windows服务需要使用Windows API,并且需要以管理员权限运行。你可以使用Visual Studio等开发工具来编译和运行这段代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值