ATL 服务程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
}