[笔记]Windows系统编程《九》Windows服务编程(二)

简介: [笔记]Windows系统编程《九》Windows服务编程(二)

三、开发Windows服务程序

前言

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。通过活动模板库,可以建立COM组件,然后通过ASP页面中的脚本对COM对象进行调用。这种COM组件可以包含属性页、对话框等控件。

ATL中所使用的基本技术包括以下几个方面:

  • COM技术
  • C++模板类技术(Template)
  • C++多继承技术(Multi-Inheritance)

3.1 创建ALT服务应用程序

文件-》新建-》项目->选择ALT项目->exe服务程序

MyService:用于生成ALT服务对应的可执行文件。

MyServicePS:动态库DLL类型,是·1服务程序与客户端进行通信的代理,御用负责服务程序与客户端的通信。

注意:

当你开发的组件需要用到代理/存根(即IPC(LPC+RPC)),就需要MyServicePS,否则MyServicePS无用

MyService.cpp是MyService项目的主文件。其中,CMyServiceModule是实现服务的类,也是从CAltServiceModuleT派生的,IDS_SERVICENAME是服务的资源表示符。_ALTModule是CMyServiceModule的对象,也是运行的服务实例。_tWinMain()是服务程序的入口函数,它是AtlModule.WinModule.WinMain()函数来初始化和加载服务。

可以运行一下。

注意:服务程序都是需要管理权限,所以exe需要配置默认以管理员运行。

右键属性-》配置属性-》链接器-》清单文件-》UAC执行级别

设置为 requireAdministrator (/level=‘requireAdministrator’)

3.2 安装和卸载ALT服务

安装

生成09.3.1MyService.exe,使用命令行安装:

09.3.1MyService.exe /Service

从任务管理服务查看已安装的服务

卸载

卸载服务命令

09.3.1MyService.exe /unRegService

我竟然没卸载成功

用sc命令卸载的

sc Delete 09.3.1MyService

3.3 设置服务的属性

设置服务的名称

打开09.3.1MyService.rc

IDS_SERVICENAME:此处为服务名,修改即可修改服务名。

设置服务描述和启动方式

inline HRESULT RegisterAppId(_In_ bool bService = false) throw()

CAtlServiceModuleT::RegisterAppId()函数用于在注册表中注册服务,在CMyServiceModule类中重载RegisterAppId函数,可以在注册服务时设置服务的描述和启动方式。

以下代码实现修改服务描述和启动方式:

HRESULT CMyServiceModule::RegisterAppId(bool bService = false) throw()
{
    HRESULT hr = S_OK;
    BOOL res = __super::RegisterAppId(bService); // 调用父类的RegisterAppId()函数
    if (bService)  {
      if(IsInstalled()) // 如果服务安装成功
      {
          // 以修改配置的权限打开服务控制器
        SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL,SERVICE_CHANGE_CONFIG);
        SC_HANDLE hService = NULL;
        if (hSCM == NULL)
          hr = AtlHresultFromLastError();
        else
        {
          // 以修改配置的权限打开安装的服务
          hService = ::OpenService(hSCM, m_szServiceName, SERVICE_CHANGE_CONFIG);
          if (hService != NULL)
          {
            ::ChangeServiceConfig(hService, SERVICE_NO_CHANGE,
              SERVICE_AUTO_START,// 修改服务为自动启动
              NULL, NULL, NULL, NULL, NULL, NULL, NULL,
              m_szServiceName); // 通过修改资源IDS_SERVICENAME 修改服务的显示名字
            // 设置服务描述信息
            SERVICE_DESCRIPTION Description;
            TCHAR szDescription[1024];
            ZeroMemory(szDescription, 1024);
            ZeroMemory(&Description, sizeof(SERVICE_DESCRIPTION));
            lstrcpy(szDescription, _T("我的第1个服务"));
            Description.lpDescription = szDescription;
            ::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &Description);
            ::CloseServiceHandle(hService);
          }
          else
            hr = AtlHresultFromLastError();
            ::CloseServiceHandle(hSCM);
        }
      }
    }
    return hr;
}

如果服务安装成功,则程序调用ChangeServiceConfig函数和ChangeServiceConfig2函数设置服务的启动方式和描述。

四、增加和使用组件

如何在ATL服务中增加组件类以及在客户端程序中使用组件类的方法。

4.1 增加组件

右键项目 添加->新建项->Vistual C++ ATL ->ATL 简单对象

MyMath

注意:

  • 添加组件类时会同时添加一个*.regs文件,作用是注册组件类,以使在客户端程序中可以调用组件类。
  • *.regs文件中添加AppID时,以指定服务程序的ID,如果不添加,则客户端创建组件时会超时报错并报错误。

MyMath.regs

HKCR
{
    //需要添加的AppID代码部分
  NoRemove AppID
  {
    '%APPID%' = s 'MyService'
    'MyService.EXE'
    {
      val AppID = s '%APPID%'
    }
  }
  NoRemove CLSID
  {
    ForceRemove {0973bc39-d603-48ec-b784-41d7ca69c58f} = s 'MyMath class'
    {
      ForceRemove Programmable
      LocalServer32 = s '%MODULE%'
      {
        val ServerExecutable = s '%MODULE_RAW%'
      }
      TypeLib = s '{15f0d8bf-d610-45b6-b643-7ab15f7b31b3}'
      Version = s '1.0'
    }
  }
}

组件类中添加函数

打开vs 类视图,可以找到IMyMath

选中MyMath右键-》添加方法,然后按如图设置参数和返回参数

查看

MyMath.cpp 添加Sum实现:

STDMETHODIMP CMyMath::Sum(LONG a, LONG b, LONG* s)
{
    // TODO: 在此处添加实现代码
    *s = a + b;
    return S_OK;
}

MyService.idl中添加

注意:最后要生成一个tbl文件,用于客户端访问。

4.2 在客户端程序中使用组件类

五、Windows服务状态监视器实例

5.1 设计程序界面

5.2 设计自定义类CService

总结

相关文章
|
11天前
|
缓存 开发工具 git
windows系统通过git上传代码
windows系统通过git上传代码
|
12天前
|
运维 监控 关系型数据库
运维实战:Windows服务挂掉了怎么办,通过Bat脚本实现自动重启
本文介绍了如何使用Bat脚本自动监控并重启Windows服务器上的挂掉服务,例如MySQL,以避免在假期等情况下需要紧急处理问题。首先,创建一个Bat脚本,设定每小时检查一次服务状态,如果服务停止则自动重启。脚本内容包括检查服务是否运行并根据状态执行相应操作。同时,脚本中包含了确保以管理员权限运行的代码。 脚本需设置为ANSI编码以防止乱码。推荐将Bat脚本封装为Windows服务以保证稳定运行,提供了使用NSSM工具、Windows服务程序和开源的Java工具winsw将批处理脚本转化为服务的方法。这些方法可以确保服务在后台可靠运行,即使在服务意外停止时也能自动恢复。
|
4天前
|
编解码 安全 网络安全
RealVNC的 VNC server在windows7系统下无法正确运行
在Windows 7上运行旧版VNC Server(如4.1.2)可能存在兼容性问题,但可通过调整配置解决。步骤包括:安装VNC Server,设置兼容性模式(选择Windows XP SP3),启动VNC Server,配置VNC连接参数。若遇到问题,检查防火墙设置,确保系统更新,并考虑升级到新版VNC Server以提高性能和兼容性。
|
11天前
|
Windows
windows系统bat批处理 打开乱码
windows系统bat批处理 打开乱码
|
11天前
|
Windows
windows系统bat批处理 打开设备管理器
windows系统bat批处理 打开设备管理器
|
11天前
|
关系型数据库 MySQL 数据安全/隐私保护
windows系统bat批处理 mysql 脚本启动关闭
windows系统bat批处理 mysql 脚本启动关闭
|
11天前
|
Java Windows
windows系统bat批处理 一键配置java jdk环境变量
windows系统bat批处理 一键配置java jdk环境变量
|
11天前
|
Windows
windows系统bat批处理 windows 关机,重启,锁定,休眠,注销
windows系统bat批处理 windows 关机,重启,锁定,休眠,注销
|
11天前
|
数据安全/隐私保护 Windows
windows系统bat批处理 笔记本开wifi 笔记本查看wifi密码
windows系统bat批处理 笔记本开wifi 笔记本查看wifi密码
|
11天前
|
Windows
windows系统bat批处理 网络设置大全 设置静态、动态IP地址
windows系统bat批处理 网络设置大全 设置静态、动态IP地址