Visual Studio 2022 创建 Windows ATL Service

1. 创建一个 ATL 项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 ATL::CATLServiceModule

项目创建后,项目中生成了一个从 ATL:: CAtlExeModuleT 模板派生的CATLServiceModule的类来实现 ATL 服务模块。
在这里插入图片描述

在ATLProject.cpp中,我们可以看到由 CAtlServiceModuleT 提供的支持。

extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/,
								LPTSTR /*lpCmdLine*/, int nShowCmd)
{
   
	return _AtlModule.WinMain(nShowCmd);
}

1.2 注册

CAtlServiceModuleT 提供用于命令行处理,包括服务的注册和删除等。
注意,需要以管理员身份执行,可以将命令行写在批处理文件中再以管理员身份执行。
也可以修改项目的UAC执行级别来解决。
在这里插入图片描述

  • 服务的注册:命令行输入 ATLService.EXE /Service(或 ATLService /Service)

  • 服务的删除:SC DELETE ATLService (服务名,非文件名)

  • 本地服务注册:ATLService /RegServer 或 ATLService -RegServer;

  • 本地服务注销:ATLService /UnRegServer 或 ATLService -UnRegServer

1.3 添加:#define _ATL_NO_COM_SUPPORT

在 framework.h 中添加:#define _ATL_NO_COM_SUPPORT,因为PreMessageLoop()没有返回S_OK,而是尝试注册COM对象,如果Windows Service不包含COM组件,则需加上此句。

1.4 修改服务名称

在 Resource View 中打开 String Table,修改 IDS_SERVICENAME 的 标题 为服务的名称:
在这里插入图片描述

1.5 修改服务的配置

在 ATLProject.cpp 中增加重载 CAtlServiceModuleT::RegisterAppId() 函数。
在类中增加 RegisterAppId 的声明

class CATLServiceModule : public ATL::CAtlServiceModuleT< CWJAltGuardServiceModule, IDS_SERVICENAME >
{
   
public :
	DECLARE_LIBID(LIBID_WJAltGuardServiceLib)
	DECLARE_REGISTRY_APPID_RESOURCEID(IDR_WJALTGUARDSERVICE, "{ff779ba8-6159-4ddc-a7e8-194a4be808e0}")
	HRESULT InitializeSecurity() throw()
	{
   
		// TODO : 调用 CoInitializeSecurity 并为服务提供适当的安全设置
		// 建议 - PKT 级别的身份验证、
		// RPC_C_IMP_LEVEL_IDENTIFY 的模拟级别
		//以及适当的非 NULL 安全描述符。

		return S_OK;
	}

public:
	HRESULT RegisterAppId(bool bService = false) throw();
};

在 RegisterAppId 函数中修改服务的配置:服务为自动启动、服务的描述信息

HRESULT CATLServiceModule::RegisterAppId(bool bService = false) throw()
{
   
    HRESULT hr = S_OK;
    BOOL res = __super ::RegisterAppId(bService);
    if (bService)
    {
   
        if (IsInstalled
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值