成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

講述C語言編寫Windows服務程序

開發 后端
Windows 服務被設計用于需要在后臺運行的應用程序以及實現沒有用戶交互的任務。為了學習這種控制臺應用程序的基礎知識,C(不是C++)是最佳選擇。

Windows 服務被設計用于需要在后臺運行的應用程序以及實現沒有用戶交互的任務。為了學習這種控制臺應用程序的基礎知識,C(不是C++)是最佳選擇。

本文將建立并實現一個簡單的服務程序,其功能是查詢系統中可用物理內存數量,然后將結果寫入一個文本文件。最后,你可以用所學知識編寫自己的 Windows 服務。

當初我寫第一個 NT 服務時,我到 MSDN 上找例子。在那里我找到了一篇 Nigel Thompson 寫的文章:“Creating a Simple Win32 Service in C++”,這篇文章附帶一個 C++ 例子。雖然這篇文章很好地解釋了服務的開發過程,但是,我仍然感覺缺少我需要的重要信息。我想理解通過什么框架,調用什么函數,以及何時調用,但 C++ 在這方面沒有讓我輕松多少。

面向對象的方法固然方便,但由于用類對底層 Win32 函數調用進行了封裝,它不利于學習服務程序的基本知識。這就是為什么我覺得 C 更加適合于編寫初級服務程序或者實現簡單后臺任務的服務。在你對服務程序有了充分透徹的理解之后,用 C++ 編寫才能游刃有余。當我離開原來的工作崗位,不得不向另一個人轉移我的知識的時候,利用我用 C 所寫的例子就非常容易解釋 NT 服務之所以然。

服務是一個運行在后臺并實現勿需用戶交互的任務的控制臺程序。Windows NT/2000/XP 操作系統提供為服務程序提供專門的支持。人們可以用服務控制面板來配置安裝好的服務程序,也就是 Windows 2000/XP 控制面板|管理工具中的“服務”(或在“開始”|“運行”對話框中輸入 services.msc /s——譯者注)。可以將服務配置成操作系統啟動時自動啟動,這樣你就不必每次再重啟系統后還要手動啟動服務。

本文將首先解釋如何創建一個定期查詢可用物理內存并將結果寫入某個文本文件的服務。然后指導你完成生成,安裝和實現服務的整個過程。

主函數和全局定義

首先,包含所需的頭文件。例子要調用 Win32 函數(windows.h)和磁盤文件寫入(stdio.h):

#include 

#include

接著,定義兩個常量:

#define SLEEP_TIME 5000

#define LOGFILE "C:\\MyServices\\memstatus.txt"

SLEEP_TIME 指定兩次連續查詢可用內存之間的毫秒間隔。在第二步中編寫服務工作循環的時候要使用該常量。

LOGFILE 定義日志文件的路徑,你將會用 WriteToLog 函數將內存查詢的結果輸出到該文件,WriteToLog 函數定義如下:

  1. int WriteToLog(char* str)  
  2. {  
  3. FILE* log;  
  4. log = fopen(LOGFILE, "a+");  
  5. if (log == NULL)  
  6. return -1;  
  7. fprintf(log, "%s ", str);  
  8. fclose(log);  
  9. return 0;  

聲明幾個全局變量,以便在程序的多個函數之間共享它們值。此外,做一個函數的前向定義:

  1. SERVICE_STATUS ServiceStatus;   
  2. SERVICE_STATUS_HANDLE hStatus;  
  3. void ServiceMain(int argc, char** argv);   
  4. void ControlHandler(DWORD request);   
  5. int InitService(); 

現在,準備工作已經就緒,你可以開始編碼了。服務程序控制臺程序的一個子集。因此,開始你可以定義一個 main 函數,它是程序的入口點。對于服務程序來說,main 的代碼令人驚訝地簡短,因為它只創建分派表并啟動控制分派機。

  1. void main()   
  2. {   
  3. SERVICE_TABLE_ENTRY ServiceTable[2];  
  4. ServiceTable[0].lpServiceName = "MemoryStatus";  
  5. ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;  
  6. ServiceTable[1].lpServiceName = NULL;  
  7. ServiceTable[1].lpServiceProc = NULL;  
  8. // 啟動服務的控制分派機線程  
  9. StartServiceCtrlDispatcher(ServiceTable);   

一個程序可能包含若干個服務。每一個服務都必須列于專門的分派表中(為此該程序定義了一個 ServiceTable 結構數組)。這個表中的每一項都要在 SERVICE_TABLE_ENTRY 結構之中。它有兩個域:

lpServiceName: 指向表示服務名稱字符串的指針;當定義了多個服務時,那么這個域必須指定;lpServiceProc: 指向服務主函數的指針(服務入口點);

分派表的最后一項必須是服務名和服務主函數域的 NULL 指針,文本例子程序中只宿主一個服務,所以服務名的定義是可選的。

服務控制管理器(SCM:Services Control Manager)是一個管理系統所有服務的進程。當 SCM 啟動某個服務時,它等待某個進程的主線程來調用 StartServiceCtrlDispatcher 函數。將分派表傳遞給 StartServiceCtrlDispatcher。這將把調用進程的主線程轉換為控制分派器。該分派器啟動一個新線程,該線程運行分派表中每個服務的 ServiceMain 函數(本文例子中只有一個服務)分派器還監視程序中所有服務的執行情況。然后分派器將控制請求從 SCM 傳給服務。

注意:如果 StartServiceCtrlDispatcher 函數30秒沒有被調用,便會報錯,為了避免這種情況,我們必須在 ServiceMain 函數中(參見本文例子)或在非主函數的單獨線程中初始化服務分派表。本文所描述的服務不需要防范這樣的情況。

分派表中所有的服務執行完之后(例如,用戶通過“服務”控制面板程序停止它們),或者發生錯誤時。StartServiceCtrlDispatcher 調用返回。然后主進程終止。

【編輯推薦】

  1. C++連接mysql數據庫的兩種方法
  2. 淺談C/C++中的static和extern關鍵字
  3. C++中的指針用法匯集
  4. 兩道出現頻率超高的C++筆試題
責任編輯:于鐵 來源: http://www.itrenjia.org  
相關推薦

2009-08-14 15:06:08

Windows服務程序

2009-08-25 15:38:12

C# Windows服

2010-01-12 10:11:36

學習C++語言

2010-01-12 15:24:48

C++語言

2009-08-14 15:19:38

Windows服務程序Windows服務

2009-12-24 09:22:07

Windows 7講述人程序

2009-08-14 11:00:16

C#創建Windows

2009-08-14 15:47:18

C#Windows服務

2009-08-14 14:25:09

Windows服務程序

2023-09-22 09:41:28

LinuxC語言

2010-01-12 10:40:22

C++程序員

2024-07-09 17:09:49

C#開發Windows窗體

2010-01-13 14:17:53

C++編譯語言

2010-01-11 13:31:03

C++語言

2009-08-14 13:41:13

C#Windows服務

2009-08-14 16:48:39

C#Windows服務

2009-08-14 14:45:03

C#Windows服務

2009-08-14 14:17:16

C#Windows服務

2009-08-14 16:24:00

Windows服務程序

2009-08-14 15:54:50

Windows服務程序C#Windows服務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品a一区二区三区网址 | av综合站| 北条麻妃99精品青青久久主播 | 韩日在线观看视频 | 日韩精品在线看 | 国产成人一区二区 | 久久久久午夜 | 一区二区三区免费观看 | 成人性生交大片免费看中文带字幕 | 免费观看www7722午夜电影 | av一区二区三区 | 精品国产一二三区 | 精品视频一区二区三区在线观看 | 国产精品久久久 | 免费亚洲一区二区 | 成人在线视频免费看 | 久久久av | 欧美中文字幕一区 | 久久爱一区 | 久久久青草婷婷精品综合日韩 | 国产成人福利在线观看 | 久久久久99 | 欧美精品在欧美一区二区 | 欧美日韩一二三区 | 国产一区中文字幕 | 91精品免费视频 | 久久激情视频 | 精品一区二区久久久久久久网精 | 国产成人精品一区 | 日本不卡视频 | 黄a网站| 国产在线一区二区三区 | 免费亚洲成人 | 色接久久 | 欧美成人性生活 | 91精品国产91久久久久久密臀 | 亚洲精品在线播放 | 欧美mv日韩mv国产网站91进入 | 中文字幕一区在线观看视频 | 亚洲精品91 | 欧美理论片在线 |