1. 新建项目。
1-1. 启动 Visual Studio 2008。选择 File -> New -> Project...。
1-2. 在 New Project 对话框中,选择 Visual C++ 中的 ATL Project模板,写入项目名称:TestWinService,点 OK。
1-3. 在打开的 ATL Project Wizard 中,点 ApplicationSettings,选择 Server type 为 Service(EXE),点 Finish。
2. 安装、卸载服务。
2-1. 编译项目。
2-2. 打开命令提示符,切换到编译后的目录,执行以下命令安装服务:
TestWinService.exe /Service
2-3. 打开服务管理,能找到一个名为TestWinService的服务,启动类型是Manual。可以启动服务、停止服务。
2-4. 停止服务,然后用以下命令卸载服务:
ShowjiSvc /UnRegServer
2-5 如果要删除服务使用命令:sc delete TestWinService
3. 修改服务的配置。
3-1. 修改服务名称:
在 Resource View 中打开 String Table,修改 IDS_SERVICENAME 的 Caption为服务的名称:***。
3-2. 修改服务的描述:
打开 TestWinService.cpp 文件,在 CTestWinServiceModule的声明中增加以下函数声明:
再增加此函数的定义:
HRESULT CTestWinServiceModule::RegisterAppId(boolbService = 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("www.showji.com示例服务,byyangwei@ligsoft.com"));
Description.lpDescription = szDescription;
::ChangeServiceConfig2(hService,SERVICE_CONFIG_DESCRIPTION, &Description);
::CloseServiceHandle(hService);
}
else
hr = AtlHresultFromLastError();
::CloseServiceHandle(hSCM);
}
}
}
OutputDebugString(L"TestWinService::RegisterAppIdFinished");
return hr;
}
3-3.添加执行函数:
添加声明:HRESULT CTestWinServiceModule::Run(intnShowCmd = SW_HIDE);
实现Run函数
HRESULT CTestWinServiceModule::Run(intnShowCmd) throw(){HRESULT hr = S_OK;hr =__super::PreMessageLoop(nShowCmd);if (hr == S_OK){if (m_bService){//可以在这里启动线程,或者什么其他东西来做自己的工作的啦//这里是什么都没有做了,只输出一条信息DWORD dwId = 0;m_hMainThread = NULL;m_hMainThread = CreateThread( NULL, 0,(LPTHREAD_START_ROUTINE)CMainThreadRun::Process, this, 0, &dwId);if (m_hMainThread == NULL ){OutputDebugString(L"CreateThreadFailed");}//上面这段代码是创建一个工作线程
OutputDebugString(L"TestWinService::Run");LogEvent(_T("widebright 的服务启动咯,呵呵"));SetServiceStatus(SERVICE_RUNNING);}//进入消息循环,不停的处理消息,可能最后分发到Handler去处理,调用了OnShutdown等函数的。__super::RunMessageLoop();}if (SUCCEEDED(hr)){hr =__super::PostMessageLoop();}
//可以在适当的时候调用Uninstall函数来卸载掉服务//__super::Uninstall();return hr;}