windows是一個大型的系統(tǒng)軟件,分成很多個部分,由很多名程序員分別完成的。每個程序員可能都有自己擅長的一種編程語言,各自使用自己擅長的語言(可能是c、c++、vb…………)編寫程序完成自己所負責(zé)的那部分程序功能,然后再編譯,組合成最后的windows操作系統(tǒng)軟件。整個過程類似工廠里面生產(chǎn)大型設(shè)備,各自完成不同部件之后再組裝。
創(chuàng)新互聯(lián)建站主營剛察網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,剛察h5小程序制作搭建,剛察網(wǎng)站營銷推廣歡迎剛察等地區(qū)企業(yè)咨詢
根據(jù)幾年前微軟在美國公布的內(nèi)容,windows本身屬于微內(nèi)核系統(tǒng),windows98總共大概不到10萬行代碼(具體是2萬還是5萬記不清了),而windows2000則已經(jīng)有20余萬行代碼,其中80%是用c++編寫,其余部分有c和匯編,底層接口用匯編編寫。
微內(nèi)核系統(tǒng)從概念上是指“只包括操作系統(tǒng)的基本功能,例如內(nèi)存管理和進程管理等等”,就連對各個文件系統(tǒng)的支持也不算在內(nèi),不過具體windows是不是這樣設(shè)計我就不清楚了。
所以一個微內(nèi)核系統(tǒng)的操作系統(tǒng)能夠有20萬行代碼已經(jīng)很多了。
之所以微軟選擇了c++而不想linux一樣選擇c,其根本原因就是windows操作系統(tǒng)本身是微內(nèi)核系統(tǒng),所以擴展性及以后的維護要求非常重要,所以c++的類的概念就能在這里很好的利用,但是畢竟c++的效率不如標(biāo)準(zhǔn)c及匯編,所以在一些明顯以效率為重的地方用的還是標(biāo)準(zhǔn)c及匯編。
編寫完畢后,windows上的其他用戶態(tài)程序(包括所有驅(qū)動程序、計算器、游戲等等所有你現(xiàn)在拿鼠標(biāo)能夠操作的東西)另行開發(fā),例如:掃雷游戲就是用vb寫的。
首先Microsoft Windows 服務(wù)(即,以前的 NT 服務(wù))使您能夠創(chuàng)建在它們自己的 Windows
會話中可長時間運行的可執(zhí)行應(yīng)用程序。這些服務(wù)可以在計算機啟動時自動啟動,可以暫停和重新啟動而且不顯示任何用戶界面。這使服務(wù)非常適合在服務(wù)器上使
用,或任何時候,為了不影響在同一臺計算機上工作的其他用戶,需要長時間運行功能時使用。還可以在不同于登錄用戶的特定用戶帳戶或默認計算機帳戶的安全上
下文中運行服務(wù)。
服務(wù)是有狀態(tài)的,當(dāng)我們使用windows自帶的服務(wù)管理程序sc.exe查看服務(wù)狀態(tài)時可以顯示服務(wù)的當(dāng)前狀態(tài),這個狀態(tài)是由我們在程序代碼中進
行控制的。你最好在服務(wù)初始化的時候?qū)⒎?wù)設(shè)置為SERVICE_START_PENDING,當(dāng)初始化完畢時設(shè)為SERVICE_RUNNING,這些
狀態(tài)是系統(tǒng)自定義的狀態(tài),可通過msdn查看其他狀態(tài)。這個狀態(tài)信息你會在sc.exe中看到。
在編寫windows服務(wù)程序過程中你需要關(guān)注的函數(shù)有:
1.首先是main函數(shù),由于windows服務(wù)不需要界面,所以大部分程序為win32控制臺應(yīng)用程序,所以程序主函
數(shù)為main 而不是WinMain()。在主函數(shù)要做的主要工作就是初始化一個SERVICE_TABLE_ENTRY
分派表結(jié)構(gòu)體,然后調(diào)用StartServiceCtrlDispatcher();這將把調(diào)用進程的主線程轉(zhuǎn)換為控制分派器。該分派器啟動一個新線程,
該線程運行分派表中對應(yīng)于你的服務(wù)的ServiceMain()函數(shù)。ServiceMain()函數(shù)將在下面提到。
此過程示例代碼如下:
SERVICE_TABLE_ENTRY entrytable[2];
entrytable[0].lpServiceName="testservice";
entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
entrytable[1].lpServiceName=NULL;
entrytable[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(entrytable);
在這之后系統(tǒng)將自動創(chuàng)建一個線程去執(zhí)行ServiceMain函數(shù)的內(nèi)容,你應(yīng)該將你要執(zhí)行的任務(wù)在ServiceMain中循環(huán),這樣服務(wù)就開始運行了。
2.ServiceMain函數(shù)為void WINAPI ServiceMain(int argc, char**
argv)格式的函數(shù),函數(shù)名字可以任意定義。它的作用就是:將你需要執(zhí)行的任務(wù)放到該函數(shù)中循環(huán)執(zhí)行即可。這就是服務(wù)程序的工作函數(shù)。在
ServiceMain執(zhí)行你的任務(wù)前,需要給SERVICE_TABLE_ENTRY
分派表結(jié)構(gòu)體進行賦值,注意由于此時服務(wù)還沒有開始執(zhí)行你的任務(wù)所以我們將服務(wù)的狀態(tài)設(shè)置為SERVICE_START_PENDING,即正在初始化。
我們進行如下賦值:
servicestatus.dwServiceType = SERVICE_WIN32;
servicestatus.dwCurrentState = SERVICE_START_PENDING;
servicestatus.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;
//在本例中只接受系統(tǒng)關(guān)機和停止服務(wù)兩種控制命令
servicestatus.dwWin32ExitCode = 0;
servicestatus.dwServiceSpecificExitCode = 0;
servicestatus.dwCheckPoint = 0;
servicestatus.dwWaitHint = 0;
hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler);
CtrlHandler為void WINAPI CtrlHandler(DWORD request)型的函數(shù),函數(shù)名字可以任意設(shè)定。將在下一點講到。
Hstatus為SERVICE_STATUS_HANDLE類型的全局變量。當(dāng)需要改變服務(wù)狀態(tài)時SetServiceStatus()函數(shù)需要它做為參數(shù)來標(biāo)識一個服務(wù)。
3. void WINAPI CtrlHandler(DWORD
request),函數(shù)的主要功能是,接收系統(tǒng)傳遞的控制命令,比如當(dāng)你通過sc.exe關(guān)閉服務(wù)時,該函數(shù)會收到
SERVICE_CONTROL_STOP消息,你就可以對服務(wù)進行必要的管理。在本例子程序中就只接收SERVICE_ACCEPT_SHUTDOWN
和SERVICE_ACCEPT_STOP消息,這是通過前面給servicestatus賦值設(shè)定的。
這樣一個基本的服務(wù)程序就完成了。
下面貼出我的示例代碼僅供參考。該代碼在vs2008中調(diào)試通過。本文結(jié)束的時候會附上如何安裝服務(wù)。
#include stdio.h
#include Windows.h
#define SLEEP_TIME 5000 //間隔時間
#define FILE_PATH "C:\\log.txt" //信息輸出文件
bool brun=false;
SERVICE_STATUS servicestatus;
SERVICE_STATUS_HANDLE hstatus;
int WriteToLog(char* str);
void WINAPI ServiceMain(int argc, char** argv);
void WINAPI CtrlHandler(DWORD request);
int InitService();
int WriteToLog(char* str)
{
FILE* pfile;
fopen_s(pfile,FILE_PATH,"a+");
if (pfile==NULL)
{
return -1;
}
fprintf_s(pfile,"%s\n",str);
fclose(pfile);
return 0;
}
void WINAPI ServiceMain(int argc, char** argv)
{
servicestatus.dwServiceType = SERVICE_WIN32;
servicestatus.dwCurrentState = SERVICE_START_PENDING;
servicestatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;//在本例中只接受系統(tǒng)關(guān)機和停止服務(wù)兩種控制命令
servicestatus.dwWin32ExitCode = 0;
servicestatus.dwServiceSpecificExitCode = 0;
servicestatus.dwCheckPoint = 0;
servicestatus.dwWaitHint = 0;
hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler);
if (hstatus==0)
{
WriteToLog("RegisterServiceCtrlHandler failed");
return;
}
WriteToLog("RegisterServiceCtrlHandler success");
//向SCM 報告運行狀態(tài)
servicestatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (hstatus, servicestatus);
//下面就開始任務(wù)循環(huán)了,你可以添加你自己希望服務(wù)做的工作
brun=true;
MEMORYSTATUS memstatus;
char str[100];
memset(str,'\0',100);
while (brun)
{
GlobalMemoryStatus(memstatus);
int availmb=memstatus.dwAvailPhys/1024/1024;
sprintf_s(str,100,"available memory is %dMB",availmb);
WriteToLog(str);
Sleep(SLEEP_TIME);
}
WriteToLog("service stopped");
}
void WINAPI CtrlHandler(DWORD request)
{
switch (request)
{
case SERVICE_CONTROL_STOP:
brun=false;
servicestatus.dwCurrentState = SERVICE_STOPPED;
break;
case SERVICE_CONTROL_SHUTDOWN:
brun=false;
servicestatus.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}
SetServiceStatus (hstatus, servicestatus);
}
void main()
{
SERVICE_TABLE_ENTRY entrytable[2];
entrytable[0].lpServiceName="testservice";
entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
entrytable[1].lpServiceName=NULL;
entrytable[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(entrytable);
}
如何安裝服務(wù):
運行命令提示符 cmd.exe
輸入 sc create testservicename binpath= D:\test.exe
輸入 sc start testservicename 啟動服務(wù)
輸入sc query 會在最底部顯示你的服務(wù)當(dāng)前的狀態(tài)
輸入 sc stop testservicename 停止服務(wù)
輸入 sc delete testservicename刪除服務(wù),該服務(wù)將在下次重啟后刪除,在重啟之前將不能注冊同一個名字的服務(wù)。
區(qū)別:
1、概括的說就是C是控制臺應(yīng)用程序,就是運行時出現(xiàn)一個就像dos黑色窗口,而widows程序設(shè)計是窗口應(yīng)用程序,就像WORD,記事本等這樣的有窗口框架的程序設(shè)計。還有就是他們的編程思想不同,C語言是面向過程的,可以理解為順序的執(zhí)行;而Widows是面向過程的,事件觸發(fā),模塊化的編程思想,如果學(xué)過VB的話就很容易理解。另外C的程序入口函數(shù)是main,windows程序的入口函數(shù)是Winmain,windows定義了很多句柄和宏定義,剛開始理解起來有些困難,比如int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
《WINDOWS程序設(shè)計》:初級或中級程序員看的
《WINDOWS核心編程》:高級和系統(tǒng)程序員看的
2、所謂初中級程序員,就是編些普通應(yīng)用程序。比如掃雷。 所謂高級程序員,就是編寫硬件驅(qū)動之類的,大型應(yīng)用程序,比如解霸。系統(tǒng)程序員,編寫底層驅(qū)動,系統(tǒng)平臺,超大型應(yīng)用程序,word,瑞星之類 。
3、它們和C語言的主要區(qū)別是,C++不是專門為Windows程序所發(fā)明的語言,其它平臺,如Mac和Linux都可以用C++,只不過Visual C++在它們上沒辦法運行就是了。另外一點,C++不是Java,不帶自己的圖形界面設(shè)計包。所以面向用戶的界面要由其它程序來完成,這才是VC的主要目的,單純用C++是不行的。
4、簡單地說就是利用windows的應(yīng)用程序接口(API),編寫windows程序。
一般用C/C++;
如果用c,就是直接用這些API。
如果用C++,就用MFC(微軟基礎(chǔ)類庫,封裝了windows 的API)。
可以采用start命令來運行。在windows
xp的命令提示符中輸入:start/seperate要運行的程序,即可運行相應(yīng)的dos程序。其中參數(shù)separate的作用是在單獨的內(nèi)存空間啟動16位程序,而用參數(shù)shared則是在共享的內(nèi)存空間啟動16位程序。當(dāng)dos程序運行后我們還可按“alt+enter”鍵在全屏幕與窗口之間進行切換。
windows 編程就是編譯的程序可以在windows環(huán)境下運行 可以用的語言很多了,如VB,VC,Delphi,java,C#等等,很多編程軟件要調(diào)用系統(tǒng)的API函數(shù),MFC,微軟基礎(chǔ)類(Microsoft Foundation Classes),同VCL(delphi的庫)類似,是一種Application Framework,隨微軟Visual C++ 開發(fā)工具發(fā)布。
網(wǎng)頁名稱:windows系統(tǒng)編程序的簡單介紹
URL標(biāo)題:http://jinyejixie.com/article28/hsdscp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站內(nèi)鏈、ChatGPT、網(wǎng)站設(shè)計、網(wǎng)站策劃、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)