?? 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 + -