[笔记]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

总结

相关文章
|
2月前
|
安全 Windows
永久关闭 Windows 11 系统更新
永久关闭 Windows 11 系统更新
157 0
|
1月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
71 32
|
1月前
|
存储 负载均衡 Java
如何配置Windows主机MPIO多路径访问存储系统
Windows主机多路径(MPIO)是一种技术,用于在客户端计算机上配置多个路径到存储设备,以提高数据访问的可靠性和性能。本文以Windows2012 R2版本为例介绍如何在客户端主机和存储系统配置多路径访问。
98 13
如何配置Windows主机MPIO多路径访问存储系统
|
1月前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
2月前
|
监控 Ubuntu Linux
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
这篇文章介绍了如何在Ubuntu和Windows系统中通过设置相同的时区并使用ntp服务来解决时间同步问题。
84 4
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
|
2月前
|
边缘计算 安全 网络安全
|
2月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
2月前
|
Apache 数据中心 Windows
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
|
2月前
|
域名解析 缓存 网络协议
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
|
2月前
|
运维 网络安全 虚拟化
Windows系统镜像检测修复建议
Windows系统镜像检测修复建议