ATL服务程序编写

4 篇文章 0 订阅
1 篇文章 0 订阅

打开VS2013,文件,新建,项目,选择ATL

名称自己随便取,确定

下一步

完成 

移除ServiceDemoPS项目

核心代码

        HRESULT InitializeSecurity() throw()
        {
            // TODO : 调用 CoInitializeSecurity 并为服务提供适当的安全设置
            // 建议 - PKT 级别的身份验证、
            // RPC_C_IMP_LEVEL_IDENTIFY 的模拟级别
            // 以及适当的非 NULL 安全描述符。

            //return S_OK;
            return CoInitializeSecurity(NULL, -1, NULL, NULL,
                RPC_C_AUTHN_LEVEL_NONE,
                RPC_C_IMP_LEVEL_IDENTIFY,
                NULL, EOAC_NONE, NULL);//创建安全说明符
        }

        HRESULT PreMessageLoop(int nShowCmd) throw()
        {
            //让服务允许暂停和继续操作  
            m_status.dwControlsAccepted = m_status.dwControlsAccepted | SERVICE_ACCEPT_PAUSE_CONTINUE 
                | SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_SESSIONCHANGE;
            HRESULT hr = __super::PreMessageLoop(nShowCmd);
            if (hr == S_FALSE)
            {
                hr = S_OK;//这里有Bug,必须这样写,后面才能继续  
            }

            //将服务状态设置为启动  
            SetServiceStatus(SERVICE_RUNNING);

            //写入系统日志  
            LogEvent(L"ServiceDemo Service Start Successfully!");

            return hr;
        }

        void Handler(_In_ DWORD dwOpcode) throw()
        {
            switch (dwOpcode)
            {
            case SERVICE_CONTROL_PAUSE://暂停  
            {
                OnPause();
                break;
            }
            case SERVICE_CONTROL_CONTINUE://继续  
            {
                OnContinue();
                break;
            }
            default:
                break;
            }

            __super::Handler(dwOpcode);
        }

        void OnPause() throw()
        {
            //设置服务状态为暂停  
            SetServiceStatus(SERVICE_PAUSED);

            __super::OnPause();
        }
        void OnStop() throw()
        {
            //设置服务状态为停止  
            SetServiceStatus(SERVICE_STOPPED);

            __super::OnStop();
        }
        void OnContinue() throw()
        {
            //设置服务状态为启动  
            SetServiceStatus(SERVICE_RUNNING);

            __super::OnContinue();
        }

        HRESULT RegisterAppId(_In_ bool bService = false) throw()
        {
            HRESULT hr = S_OK;
            BOOL res = __super::RegisterAppId(bService);
            if (bService)
            {
                if (IsInstalled())//服务已经安装  
                {
                    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SERVICE_CHANGE_CONFIG);//打开服务管理器  
                    SC_HANDLE hService = NULL;

                    if (hSCM == NULL)
                    {
                        hr = ATL::AtlHresultFromLastError();
                    }
                    else
                    {
                        //打开服务,m_szServiceName为基类成员变量,代表当前服务名称  
                        //可以在资源文件列表的String Table中修改  
                        hService = OpenService(hSCM, m_szServiceName, SERVICE_CHANGE_CONFIG);
                        if (hService != NULL)
                        {
                            //修改服务配置  
                            ChangeServiceConfig(hService,
                                SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,//独立进程、允许交互  
                                SERVICE_AUTO_START,//服务自动启动  
                                NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                                m_szServiceName);

                            //服务描述信息  
                            SERVICE_DESCRIPTION sDescription;
                            TCHAR szDescription[1024];
                            ZeroMemory(szDescription, 1024);
                            ZeroMemory(&sDescription, sizeof(SERVICE_DESCRIPTION));

                            //服务描述  
                            lstrcpy(szDescription, _T("ServiceDemo测试服务"));
                            sDescription.lpDescription = szDescription;

                            //修改服务描述信息  
                            ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &sDescription);

                            //关闭服务句柄  
                            CloseServiceHandle(hService);

                        }
                        else
                        {
                            hr = ATL::AtlHresultFromLastError();
                        }
                    }

                    //关闭服务管理器句柄  
                    ::CloseServiceHandle(hSCM);
                }
            }
            return hr;
        }

以管理员身份,打开命令行,切到程序目录

ServiceDemo.exe /Service 注册服务

就可以看到刚刚注册的服务

 net start ServiceDemo 启动服务

net stop ServiceDemo 停止服务

ServiceDemo.exe /UnRegServer 卸载服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值