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

講述C語言編寫Windows服務(wù)程序

開發(fā) 后端
Windows 服務(wù)被設(shè)計(jì)用于需要在后臺(tái)運(yùn)行的應(yīng)用程序以及實(shí)現(xiàn)沒有用戶交互的任務(wù)。為了學(xué)習(xí)這種控制臺(tái)應(yīng)用程序的基礎(chǔ)知識(shí),C(不是C++)是最佳選擇。

Windows 服務(wù)被設(shè)計(jì)用于需要在后臺(tái)運(yùn)行的應(yīng)用程序以及實(shí)現(xiàn)沒有用戶交互的任務(wù)。為了學(xué)習(xí)這種控制臺(tái)應(yīng)用程序的基礎(chǔ)知識(shí),C(不是C++)是最佳選擇。

本文將建立并實(shí)現(xiàn)一個(gè)簡單的服務(wù)程序,其功能是查詢系統(tǒng)中可用物理內(nèi)存數(shù)量,然后將結(jié)果寫入一個(gè)文本文件。最后,你可以用所學(xué)知識(shí)編寫自己的 Windows 服務(wù)。

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

面向?qū)ο蟮姆椒ü倘环奖悖捎谟妙悓?duì)底層 Win32 函數(shù)調(diào)用進(jìn)行了封裝,它不利于學(xué)習(xí)服務(wù)程序的基本知識(shí)。這就是為什么我覺得 C 更加適合于編寫初級(jí)服務(wù)程序或者實(shí)現(xiàn)簡單后臺(tái)任務(wù)的服務(wù)。在你對(duì)服務(wù)程序有了充分透徹的理解之后,用 C++ 編寫才能游刃有余。當(dāng)我離開原來的工作崗位,不得不向另一個(gè)人轉(zhuǎn)移我的知識(shí)的時(shí)候,利用我用 C 所寫的例子就非常容易解釋 NT 服務(wù)之所以然。

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

本文將首先解釋如何創(chuàng)建一個(gè)定期查詢可用物理內(nèi)存并將結(jié)果寫入某個(gè)文本文件的服務(wù)。然后指導(dǎo)你完成生成,安裝和實(shí)現(xiàn)服務(wù)的整個(gè)過程。

主函數(shù)和全局定義

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

#include 

#include

接著,定義兩個(gè)常量:

#define SLEEP_TIME 5000

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

SLEEP_TIME 指定兩次連續(xù)查詢可用內(nèi)存之間的毫秒間隔。在第二步中編寫服務(wù)工作循環(huán)的時(shí)候要使用該常量。

LOGFILE 定義日志文件的路徑,你將會(huì)用 WriteToLog 函數(shù)將內(nèi)存查詢的結(jié)果輸出到該文件,WriteToLog 函數(shù)定義如下:

  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;  

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

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

現(xiàn)在,準(zhǔn)備工作已經(jīng)就緒,你可以開始編碼了。服務(wù)程序控制臺(tái)程序的一個(gè)子集。因此,開始你可以定義一個(gè) main 函數(shù),它是程序的入口點(diǎn)。對(duì)于服務(wù)程序來說,main 的代碼令人驚訝地簡短,因?yàn)樗粍?chuàng)建分派表并啟動(dòng)控制分派機(jī)。

  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. // 啟動(dòng)服務(wù)的控制分派機(jī)線程  
  9. StartServiceCtrlDispatcher(ServiceTable);   

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

lpServiceName: 指向表示服務(wù)名稱字符串的指針;當(dāng)定義了多個(gè)服務(wù)時(shí),那么這個(gè)域必須指定;lpServiceProc: 指向服務(wù)主函數(shù)的指針(服務(wù)入口點(diǎn));

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

服務(wù)控制管理器(SCM:Services Control Manager)是一個(gè)管理系統(tǒng)所有服務(wù)的進(jìn)程。當(dāng) SCM 啟動(dòng)某個(gè)服務(wù)時(shí),它等待某個(gè)進(jìn)程的主線程來調(diào)用 StartServiceCtrlDispatcher 函數(shù)。將分派表傳遞給 StartServiceCtrlDispatcher。這將把調(diào)用進(jìn)程的主線程轉(zhuǎn)換為控制分派器。該分派器啟動(dòng)一個(gè)新線程,該線程運(yùn)行分派表中每個(gè)服務(wù)的 ServiceMain 函數(shù)(本文例子中只有一個(gè)服務(wù))分派器還監(jiān)視程序中所有服務(wù)的執(zhí)行情況。然后分派器將控制請(qǐng)求從 SCM 傳給服務(wù)。

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

分派表中所有的服務(wù)執(zhí)行完之后(例如,用戶通過“服務(wù)”控制面板程序停止它們),或者發(fā)生錯(cuò)誤時(shí)。StartServiceCtrlDispatcher 調(diào)用返回。然后主進(jìn)程終止。

【編輯推薦】

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

2009-08-14 15:06:08

Windows服務(wù)程序

2009-08-25 15:38:12

C# Windows服

2010-01-12 10:11:36

學(xué)習(xí)C++語言

2010-01-12 15:24:48

C++語言

2009-08-14 15:19:38

Windows服務(wù)程序Windows服務(wù)

2009-08-14 11:00:16

C#創(chuàng)建Windows

2009-08-14 15:47:18

C#Windows服務(wù)

2009-12-24 09:22:07

Windows 7講述人程序

2009-08-14 14:25:09

Windows服務(wù)程序

2010-01-12 10:40:22

C++程序員

2023-09-22 09:41:28

LinuxC語言

2010-01-13 14:17:53

C++編譯語言

2010-01-11 13:31:03

C++語言

2024-07-09 17:09:49

C#開發(fā)Windows窗體

2009-08-14 13:41:13

C#Windows服務(wù)

2009-08-14 16:48:39

C#Windows服務(wù)

2009-08-14 14:45:03

C#Windows服務(wù)

2009-08-14 14:17:16

C#Windows服務(wù)

2009-08-14 16:24:00

Windows服務(wù)程序

2009-08-14 15:54:50

Windows服務(wù)程序C#Windows服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 伊人精品久久久久77777 | 中文字幕视频一区 | 欧美亚洲国语精品一区二区 | 亚洲美乳中文字幕 | 337p日本欧洲亚洲大胆精蜜臀 | 精品视频一区二区 | 人妖videosex高潮另类 | 第一色在线 | 中文字幕精品一区 | 色在线免费 | 精品欧美色视频网站在线观看 | 久热精品在线播放 | 97色在线观看免费视频 | 欧洲一级毛片 | 国产视频一区二区三区四区五区 | 欧美视频一区二区三区 | 亚洲日本欧美日韩高观看 | 久久久精品 | 亚洲国产精品一区 | 亚洲综合大片69999 | 亚洲成人一级 | 中文字幕在线一区 | 欧美精品电影一区 | 国产精品久久久久久久久久久久久久 | 婷婷久久五月 | 成人久久视频 | 一区二区欧美在线 | 午夜精品一区二区三区在线播放 | 久久久久免费精品国产 | 中文字幕乱码一区二区三区 | 精品一区二区三区在线观看国产 | 免费看片国产 | 亚洲五码久久 | 亚洲一区二区三区四区五区午夜 | 美女久久视频 | 欧美手机在线 | 久久久久国产精品人 | 精品九九 | 久久国产亚洲精品 | 亚洲成av人影片在线观看 | 日韩视频一区二区在线 |