用C++编制Win32 Service (一)

  .Net和Delphi都对Service进行了很好的封装,但是用C++编写Service还是一件很烦琐的事情。先写一些辅助类吧:

// 管理Service的句柄
class ServiceHandle {
public:
    ServiceHandle(SC_HANDLE h) : h_(h) {
        if (!h_)
            throw SysError();
    }
    ~ServiceHandle() { ::CloseServiceHandle(h_); }
    operator SC_HANDLE () { return h_; }
private:
    SC_HANDLE    h_;
    ServiceHandle(const ServiceHandle &); // disallowed
    ServiceHandle & operator = (const ServiceHandle &); // disallowed
};

// 分析命令行参数
class CmdLine {
public:
    CmdLine(void) {
        args_ = ::CommandLineToArgvW(GetCommandLineW(), &argCount_);
        if (!args_)
            throw SysError();
        current_ = 1;
    }
    ~CmdLine(void) {
        if (args_)
            ::GlobalFree(reinterpret_cast<HGLOBAL>(args_));
    }
    const wchar_t * getNext(void) {
        if (current_ < argCount_)
            return args_[current_++];
        else
            return 0;
    }
    int getCount(void) const { return argCount_-1; }
private:
    wchar_t        **    args_;
    int                argCount_;
    int                current_;
};

  凡是需要释放资源的东西(如上面的GlobalFree、CloseServiceHandle等等),我都喜欢写个简单的类来封装,让析构函数来防止我忘记做这事儿。:)
  单个的EXE允许含有多个服务(尽管不太常见),所以需要有一个东西来维护多个服务的列表,同时也便于根据服务名来查找相应的服务类(因为Windows的回调函数只能是静态函数而不能是类方法)。我用ServiceBase这个基类来表示一个服务,使用时从这个基类继承(Template模式),同时用ServiceApplication这个类来管理维护ServiceBase列表,进行服务的安装卸载工作,以及对命令行的解析,第一反应ServiceApplication应该是个Singleton,但似乎也可以仅让“服务列表”这个成员变量成为一个静态成员(用 std::map<std::wstring, ServiceBase *> > 作为变量类型似乎是个不错的选择)。
  值得一记的是具有13个参数的API: CreateService(),有几个地方需要记录一笔:
  • 如果指定SERVICE_INTERACTIVE_PROCESS标志,则该服务被允许与桌面交互,不过据其他资料记载,这里面含有不安全因素(主要是权限的不当提升),而且在Windows将来的版本中,也许会取消这个特性。
  • 默认启动服务的帐号是LocalSystem,这个帐号具有相当高的权限,而在XP及以后版本中,推荐用LocalService或NetworkService这两个权限相对较低的帐号来启动服务。
  • 通常我们创建的服务会有一些描述信息(Description),这个可以在成功安装服务后,用ChangeServiceConfig2()这个API来实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值