C快速編寫簡單windows服務程序調用程序 (示例)_第1頁
C快速編寫簡單windows服務程序調用程序 (示例)_第2頁
C快速編寫簡單windows服務程序調用程序 (示例)_第3頁
C快速編寫簡單windows服務程序調用程序 (示例)_第4頁
C快速編寫簡單windows服務程序調用程序 (示例)_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C+快速編寫 windows 服務程序調用程序2012-07-19 23:42:22| 分類:C/C+ | 標簽:windows 服務程序 c+ 快速簡單 |字號 訂閱前不久 , 為完成項目中某個功能 , 需要寫個 windows 服務程序 , 定時來調用另外的一個 exe 程序 , 完成過程遇到頗多問題 , 作為初學者 , 分享一下我的整個過程 . 參考了多位大神的文章 . 資料來自網上 , 最后給出鏈接 . 表示感謝以下是一些基本知識 , 不得不耐下心去理解 , 這對程序理解和編寫非常用幫助 .首先 Microsoft Windows 服務(即,以前的 NT 服務使您能夠創(chuàng)建在它們自己的

2、Windows 會話中可長時間運行的可執(zhí)行應用程序。這些服務可以在計算機啟動時自動啟動, 可以暫停和重新啟動而且不顯示任何用戶界面。 這使服務非常適合在服務器上使用, 或任何 時候, 為了不影響在同一臺計算機上工作的其他用戶, 需要長時間運行功能時使用。 還可以 在不同于登錄用戶的特定用戶帳戶或默認計算機帳戶的安全上下文中運行服務。服務是有狀態(tài)的, 當我們使用 windows 自帶的服務管理程序 sc.exe 查看服務狀態(tài)時可以顯 示服務的當前狀態(tài), 這個狀態(tài)是由我們在程序代碼中進行控制的。 你最好在服務初始化的時 候將服務設置為 SERVICE_START_PENDING,當初始化完畢時設為

3、SERVICE_RUNNING,這些狀態(tài)是系統(tǒng)自定義的狀態(tài), 可通過 msdn 查看其他狀態(tài)。 這個狀態(tài)信息你會在 sc.exe 中看到。在編寫 windows 服務程序過程中你需要關注的函數有:1. 首先是 main 函數, 由于 windows 服務不需要界面, 所以大部分程序為 win32控制臺應用 程序,所以程序主函數為 main 而不是 WinMain(。在主函數要做的主要工作就是初始化一 個 SERVICE_TABLE_ENTRY 分派表結構體, 然后調用 StartServiceCtrlDispatcher(;這將 把調用進程的主線程轉換為控制分派器。 該分派器啟動一個新線程,

4、該線程運行分派表中對 應于你的服務的 ServiceMain (函數。 ServiceMain (函數將在下面提到。此過程示例代碼如下:SERVICE_TABLE_ENTRY entrytable2;entrytable0.lpServiceName="testservice"entrytable0.lpServiceProc=(LPSERVICE_MAIN_FUNCTIONServiceMain;entrytable1.lpServiceName=NULL;entrytable1.lpServiceProc=NULL;StartServiceCtrlDispatcher(

5、entrytable;在這之后系統(tǒng)將自動創(chuàng)建一個線程去執(zhí)行 ServiceMain 函數的內容, 你應該將你要執(zhí)行的任 務在 ServiceMain 中循環(huán),這樣服務就開始運行了。2. ServiceMain 函數為 void WINAPI ServiceMain(int argc, char* argv格式的函數,函 數名字可以任意定義。 它的作用就是:將你需要執(zhí)行的任務放到該函數中循環(huán)執(zhí)行即可。 這 就是服務程序的工作函數。在 ServiceMain 執(zhí)行你的任務前,需要給SERVICE_TABLE_ENTRY 分派表結構體進行賦值, 注意由于此時服務還沒有開始執(zhí)行你的任務所以我們將服務的

6、狀態(tài)設置 為 SERVICE_START_PENDING,即正在初始化。我們進行如下賦值: servicestatus.dwServiceType = SERVICE_WIN32;servicestatus.dwCurrentState = SERVICE_START_PENDING; servicestatus.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCE PT_STOP;/在本例中只接受系統(tǒng)關機和停止服務兩種控制命令servicestatus.dwWin32ExitCode = 0;servicestatus.dwServi

7、ceSpecificExitCode = 0;servicestatus.dwCheckPoint = 0;servicestatus.dwWaitHint = 0;hstatus = :RegisterServiceCtrlHandler("testservice", CtrlHandler;CtrlHandler 為 void WINAPI CtrlHandler(DWORD request型的函數,函數名字可以任意設 定。將在下一點講到。Hstatus 為 SERVICE_STATUS_HANDLE 類 型 的 全 局 變 量 。 當 需 要 改 變 服 務 狀 態(tài)

8、時 SetServiceStatus (函數需要它做為參數來標識一個服務。3. void WINAPI CtrlHandler(DWORD request,函數的主要功能是,接收系統(tǒng)傳遞的控制 命令, 比如當你通過 sc.exe 關閉服務時, 該函數會收到 SERVICE_CONTROL_STOP消息, 你就可以對服務進行必要的管理。在本例子程序中就只接收SERVICE_ACCEPT_SHUTDOWN 和SERVICE_ACCEPT_STOP消息,這是通過前面給 servicestatus 賦值設定的。 這樣一個 基本的服務程序就完成了。 本文結束的時候會附上如何安裝服務。當服務程序需要使用某些功能時,由于用戶的關系而受到限制,比如訪問注冊表的 HKEY_CURRENT_USER鍵,使用網絡等等,這時候就需要以當前登陸用戶的身 份去進行操作,通常會創(chuàng)建一個進程來完成需要的功能。如果使用 CreateProcess, return bResult; 然后安裝服務運行 cmd.exe 輸入以下: sc create your_service_name binpath= D:backupGetXML.exe 個空格 sc start your_service_name /啟動服

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論