ATL 服务程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 新建项目。

1-1. 启动Visual Studio 2008。选择File -> New -> Project...。

1-2. 在New Project 对话框中,选择Visual C++ 中的ATL Project 模板,写入项目名称:ShowjiSvc,点OK。

1-3. 在打开的ATL Project Wizard - ShowjiSvc 中,点Application Settings,选择Server type 为

Service(EXE),点Finish。

2. 安装、卸载服务。

2-1. 编译项目。

2-2. 打开命令提示符,切换到编译后的目录,执行以下命令安装服务:

ShowjiSvc /Service

2-3. 打开服务管理,能找到一个名为ShowjiSvc 的服务,启动类型是Manual。可以启动服务、停止服务。2-4. 停止服务,然后用以下命令卸载服务:

ShowjiSvc /UnRegServer

3. 修改服务的配置。

3-1. 修改服务名称:

在Resource View 中打开String Table,修改IDS_SERVICENAME 的Caption 为服务的名称:Showji Mobile Service。

3-2. 修改服务的描述:

打开ShowjiSvc.cpp 文件,在CShowjiSvcModule 的声明中增加以下函数声明:

HRESULT RegisterAppId(bool bService);

再增加此函数的定义:

HRESULT CShowjiSvcModule::RegisterAppId(bool bService = false) throw()

{

HRESULT hr = S_OK;

BOOL res = __super::RegisterAppId(bService);

if (bService)

{

if (IsInstalled())

{

SC_HANDLE hSCM = ::OpenSCManagerW(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("示例服务,by yangwei@"));

Description.lpDescription = szDescription;

::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION,

&Description);

::CloseServiceHandle(hService);

}

else

hr = AtlHresultFromLastError();

::CloseServiceHandle(hSCM);

}

}

}

return hr;

}

3-3. 测试修改后的服务。

重新注册服务,在服务管理器中可以看到服务的新名称和描述,并且启动状态已经修改为Automatic。

测试成功后,注销服务。

4. 修改服务的进程安全设置。

打开ShowjiSvc.cpp,在CShowjiSvcModule 的声明中,找到InitializeSecurity 函数,修改如下:HRESULT InitializeSecurity() throw()

{

return CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,

RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL );

}

要根据自己的情况,做相关的安全性设置。如果没有什么特殊的安全性要求,就按照上面的格式写就行了。如果没有设置进程安全性的代码,那么VC 客户端创建对象的时候,会返回E_ACCESSDENIED 的错误。VB 客户端的错误提示如下:

实时错误'70': 拒绝的权限(Run-time error '70': Permission denied)。

5. 增加服务的初始化和释放操作。

打开ShowjiSvc.cpp,在CShowjiSvcModule 的声明中,增加以下声明:HRESULT PreMessageLoop(int nShowCmd);

HRESULT PostMessageLoop();

增加以上声明的相关定义:

HRESULT CShowjiSvcModule::PreMessageLoop(int nShowCmd) throw() {

HRESULT hr = __super::PreMessageLoop(nShowCmd);

if (SUCCEEDED(hr))

{

// Add any custom code to initialize your service

}

return hr;

}

HRESULT CShowjiSvcModule::PostMessageLoop() throw()

{

HRESULT hr = __super::PostMessageLoop();

if (SUCCEEDED(hr))

{

// Add any custom code to uninitialize your service

}

相关文档
最新文档