在進行C++開發時,僅僅是它的語法、特性、標准類庫就已經是一門非常高深的課程,所以在開始學習的時候,一定要認真仔細,這樣才能及時准確的編譯出自己想要的程序。
當初我寫第一個 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 函數定義如下:
- int WriteToLog(char* str)
- {
- FILE* log;
- log = fopen(LOGFILE, "a+");
- if (log == NULL)
- return -1;
- fprintf(log, "%s\n", str);
- fclose(log);
- return 0;
- }
聲明幾個全局變量,C++ 以便在程序的多個函數之間共享它們值。