如何创建简单ATL服务应用

来源:互联网 发布:淘宝怎么申请花呗 编辑:程序博客网 时间:2024/05/21 17:18

废话不多说,直接开始吧

VS2005新建项目时选中ATL项目

 

ATL项目向导中选择服务(EXE)选项

 

至于属性化,个人建议勾选,方便集中管理你的服务的初始化

创建完成后,你会得到以下两个工程(如图)

 

其中TyUpdateService编译后会得到一个TyUpdateService.exe的一个服务程序

运行这个程序的时候 给以参数 –Service 便能注册你的服务了

至于TyUpdateServicePS,其实我也不太明白。理论上只有当你要写进程外COM服务的时候才用开发这个工程,进程内com服务的时候是不用的。但这个理论我实在是不明白,所以也只能这样搪塞过去。

       新建完工程,接下来就需要给我们的服务来添加功能了

切换到类视图,给工程TyUpdateService添加类,在选择类型的时候选择ATL简单对象

 

在向导过程中只需填一个类名简称就OK了,这个对象就完成了,向导会自动的帮你生成接口,同时会在注册文件中记录该接口。

如下图

 

 

CAutoUpdate便是我增加的一个类,IAutoUpdate是与之对应的接口。

接下来,给接口添加方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

方法的IDL属性选默认就好了。完成这个操作的时候,会在两个地方声明这个方法

TyUpdateService.idl 

AutoUpdate.h

IDL当然就是IDL接口文件了,用来说明操作(过程或函数),操作的参数以及数据类型

至于头文件就不多说了

这里需要注意几点:在服务程序的TyUpdateService.cpp中有一个Module类,从CAtlServiceModuleT 继承(如果是属性化的服务程序,则将这个都包装起来,限于水平,无法追踪,个人建议如果要深入了解ATL服务程序的原理,使用VC6开发会更为清晰)

CAtlServiceModuleT atlbase.h中定义,CAtlServiceModuleT 的构造函数中给dwServiceType 默认赋值为 SERVICE_WIN32_OWN_PROCESS 并不支持服务程序与桌面的交互 这时候需要更改为 SERVICE_WIN32_OWN_PROCESS| SERVICE_INTERACTIVE_PROCESS 这种做法是不值得提的,只是不得已才修改 atlbase.h文件 同时需要修改的还有 ::CreateService() 中的第5个参数。

如果想修改服务的启动方式 同样修改::CreateService()6个参数,自动启动为SERVICE_AUTO_START

这里额外需要注意一点的是,在创建完一个ATL服务 在它的InitializeSecurity()函数中应该加上 CoInitializeSecurity() 以设置该服务的安全设置,具体参数及描述见MSDN。同样,在调用该服务的时候,也需要做同样的安全设置——即调用此函数。

到此,服务已经创建完毕,下面让我们看看如何调用。

       新建一个项目,个人建议在构造函数中做以下初始化。

     hr = CoInitialize(NULL);

       ASSERT(SUCCEEDED(hr));

hr = CoInitializeSecurity(NULL, -1, NULL, NULL,RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);

       ASSERT(SUCCEEDED(hr));

在调用的时候先要建立一个连接,当然,在此之前你应该已经声明你的ATL对象实例

IAutoUpdate* m_server;

hr = CoCreateInstance(CLSID_AutoUpdate, NULL, CLSCTX_SERVER, IID_IAutoUpdate, (void**)&m_server);

在远程系统中创建一个对象时,可以调用CoCreateInstanceEx()。如果只是这样,你在编译的时候会发现找不到 CLSID_AutoUpdate IAutoUpdate等内容的声明。这时,需要包含两个文件,也就是下图中生成的文件夹中的两个文件。

 

创建了COM对象之后,你就可以调用其中的内容了。这种模式主要是为了解决在企业中,普遍用户的计算机都有严格权限级别,当你需要在做一些需要超级用户权限操作的时候就会存在一个权限不足的问题,比如,运行安装程序。通过这种服务的方式,你的程序只需要调用服务接口,让服务来完成你的任务。服务的权限是SYSTEM