📄 windows服务框架.txt
字号:
Windows服务框架
Windows服务包括四大部分:
一,服务控制管理器(Service Control Manager)。是系统中的一个RPC服务器,总管所有服务,“Admin$\System32\Services.exe”。拥有一个在注册表中记录的数据库,包含了所有已安装的服务程序和设备驱动服务程序的相关信息。
二,服务控制程序(Service Control Program)。用来执行对服务程序的开启、控制和状态查询功能。
三,服务程序(Service Program)。服务的执行代码。
四,服务配置程序(Service Configuration Program)。 用来更改,查询已安装服务的信息。
=====================================================================
简单的CService类成员变量:
TCHAR m_szServiceName[256];
TCHAR m_szServiceDisplayedName[256];
SERVICE_STATUS_HANDLE m_hServiceStatus;
SERVICE_STATUS m_status;
BOOL m_bService;
=====================================================================
初始化:
CService::Init(LPCTSTR pServiceName,LPCTSTR pServiceDisplayedName)
{
lstrcpy(m_szServiceName,pServiceName);
lstrcpy(m_szServiceDisplayedName,pServiceDisplayedName);
//服务初始状态
m_hServiceStatus = NULL;
m_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
m_status.dwCurrentState = SERVICE_STOPPED;
m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
m_status.dwWin32ExitCode = 0;
m_status.dwServiceSpecificExitCode = 0;
m_status.dwCheckPoint = 0;
m_status.dwWaitHint = 0;
}
=====================================================================
创建服务:
CService::Install()
{
//获得SCM的句柄
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
//获得执行文件路径
TCHAR szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, _MAX_PATH);
//创建服务,获得服务对象句柄
SC_HANDLE hService = ::CreateService(
hSCM, m_szServiceName, m_szServiceDisplayedName,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
szFilePath, NULL, NULL, NULL, NULL, NULL);
//启动服务
StartService(hService, 0, NULL);
//释放句柄
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
}
注销服务:
CService::Uninstall(DWORD dwTimeout)
{
//获得SCM的句柄
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
//获得要注销的服务对象句柄
SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName,
SERVICE_STOP | DELETE | SERVICE_QUERY_STATUS);
SERVICE_STATUS status = {0};
DWORD dwStartTime = GetTickCount();
//停止服务
if (ControlService(hService, SERVICE_CONTROL_STOP, &status))
{
//等待服务停止
while ( status.dwCurrentState != SERVICE_STOPPED )
{
Sleep( status.dwWaitHint );
if ( !QueryServiceStatus( hService, &status ) )
return FALSE;
if ( status.dwCurrentState == SERVICE_STOPPED )
break;
if ( GetTickCount() - dwStartTime > dwTimeout )
{
//无法停止
return FALSE;
}
}
}
//注销服务
BOOL bDelete = ::DeleteService(hService);
//释放句柄
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
}
=====================================================================
开始服务:
CService::Start()
{
SERVICE_TABLE_ENTRY st[] =
{
{ m_szServiceName, _ServiceMain },
{ NULL, NULL }
};
if (!::StartServiceCtrlDispatcher(st) && m_bService)
{
DWORD dw = GetLastError();
LogEvent("StartServiceCtrlDispatcher Error=%d",dw);
m_bService = FALSE;
}
if (m_bService == FALSE)
Run();
}
服务的入口点:
CService::ServiceMain()
{
//注册一个Handler来向服务发送控制请求信息
m_status.dwCurrentState = SERVICE_START_PENDING;
m_hServiceStatus = RegisterServiceCtrlHandler(m_szServiceName, _Handler);
//设置服务状态
SetServiceStatus(SERVICE_START_PENDING);
m_status.dwWin32ExitCode = S_OK;
m_status.dwCheckPoint = 0;
m_status.dwWaitHint = 0;
//执行代码
Run();
//设置服务状态
SetServiceStatus(SERVICE_STOPPED);
}
服务执行函数体:
void CService::Run()
{
m_dwThreadID = GetCurrentThreadId();
//设置服务开始
if (m_bService)
SetServiceStatus(SERVICE_RUNNING);
//主体代码
MessageBox(NULL, "Hello yoyo", m_szServiceName, MB_OK);
MSG msg;
while (GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//服务结束
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -