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