一般程序可以定為乙個正在執行的程式的乙個例項,
乙個核心物件,作業系統可以用它來管理程序。也是系統儲存程序統計資訊的地方。
乙個位址空間,其中包含了可執行檔案和dll模組的**資料,同時包括動態記憶體分配,和執行緒堆疊和堆得分配。
cpu的工作方式,是 乙個程序可以有多個執行緒..然後cpu會輪流排程資源分配給各個執行緒,就像乙個時鐘一樣。
關於windows應用程式的組成
要點描述:
1. gui 和 cui 分別表示 圖形和控制台的介面,
2./subsystem:console 和 /sub-system:windows 分別是控制台和視窗的鏈結器開關
3._twinmain 圖形介面的入口點函式 和
_tmain 控制台介面的入口點函式。
一、windows一般可以建立兩種應用程式。
1.gui程式 - 圖形使用者介面 - 它使用的聯結器開關是/subsystem:console
2.cui程式 - 控制台介面 - 它使用的聯結器開關是/sub-system:windows
作業系統會載入並檢查可執行檔案映像的檔案頭,並獲取這個子系統值。
根據子系統值來建立 乙個符合要求的程式介面。
二、 windows 應用程式 都會有個入口點函式,在程式執行時,函式會被呼叫。
int winapi _twinmain(
hinstance hinstanceexe,
hinstance,
ptstr pszcmdline,
int ncmdshow);
int _tmain(
int argc,
tchar *argv,
tchar *envp);
作業系統實際並不呼叫我們所寫的入口點函式。相反,它會呼叫由c/c++執行庫實現並鏈結時使用-entry:命令選項來設定
的乙個c/c++執行時啟動函式。該函式將初始化c/c++執行庫,使我們能呼叫malloc和free之類函式。
應用程式型別和相應的入口點函式表
應用程式型別
入口點函式(入口)
嵌入可執行檔案的啟動函式
處理ansi字元和字串的gui應用程式
_twinmain (winmain)
winmaincrtstartup
處理unicode字元和字串的gui應用程式
_twinmain (wwinmain)
wwinmaincrtstartup
處理ansi字元和字串的cui應用程式
_tmain (main)
maincrtstartup
處理unicode字元和字串的cui應用程式
_tmain (wmain)
wmaincrtstartup
當鏈結器正確選擇了c/c++執行庫啟動函式後,鏈結器會根據指定的鏈結器開關,尋找相應的入口點函式,否則會返回
"unresolved external symbol"(無法解析的外部符號)錯誤。 不然一般會根據情況分別選擇 嵌入可執行檔案的啟動函式。
當然我們也可以從自己的專案中移除/subsystem鏈結器開關,讓程式自動判斷應該使用哪個子系統。
去啟動入口點函式 (winmain, wwinmain, main, or wmain) 。
visualc++有自帶c執行庫的原始碼。可以在ertex.c檔案中找到 這4個啟動入口點函式源**。這些啟動函式的用途下面簡單說下:
1.獲取指向心程序的完整命令列的乙個指標。
2.獲取指向新程序的壞境變數的乙個指標。
3.初始化c/c++執行庫的全域性變數。如果包含了stdlib.h,我們的**就可以訪問這些變數。
4.初始化c執行庫記憶體分配函式malloc和calloc和其他底層i/o歷程使用的堆。
5.呼叫所有全域性和靜態c++類物件的建構函式。
變數名稱
型別 描述和推薦使用的windws函式
_osver
unsigned int
作業系統構建的版本號, 如windows vista rtm was build 6000. 所以, _osver 的值就是6000. 請換用 getversionex.
_winmajor
unsigned int
以十六進製制表示的windows系統的主版本. 對於windows vista,該值為6. 請換用getversionex.
_winminor
unsigned int
以十六進製制表示的windows系統的主版本. 對於windows vista,該值為0. 請換用getversionex.
_winver
unsigned int
(_winmajor << 8) + _winminor. 請換用getversionex.
__argc
unsigned int
命令列上傳遞的引數個數. 請換用 getcommandline .
__argv
__wargv
char
wchar_t
長度為 __argc 的乙個陣列 ,其中含有指向 ansi/unicode 字串指標.
陣列中的每一項都指向乙個命令列引數. 注意,如果定義了_unicode,__argv 就為 null如果沒有定義__wargv 為 null 請換用 getcommandline.
_environ
_wenviron
char
wchar_t
乙個指標陣列,這些指標指向ansi/unicode字串. 陣列中的每一項都指向乙個環境字串. 注意,如果沒定義_unicode ,_wenviron 就為 null如果已經定義了_unicode, _environ is null。請換用getenvironmentstrings 或 getenvironmentvariable
_pgmptr
_wpgmptr
char
wchar_t
正在執行的程式的名稱及其ansi/unicode完整路徑.
注意,如果已經定義了 _unicode ,_pgmptr is null如果沒有定義——unicode,_wpgmptr is null 請換用getmodulefilename, 將 null 作為第乙個引數傳給該函式。
程式和程序
程式 或者狹義上講可執行檔案 是乙個靜態的概念,它就是一些預先編譯好的指令合資料集合的乙個檔案 程序則是乙個動態的概念,它是程式執行時的乙個過程,很多時候把動態庫叫做執行時 runtime 也有一定的含義。有人做過乙個很有意思的比喻,說把程式和程序的概念跟做菜相比較的話,那麼程式就是菜譜,計算機的c...
Windows驅動程式的基本結構
以下均為個人見解,如果有誤,敬請指正,謝謝 windows驅動程式的兩個重要的資料結構,驅動裝置物件driver object 裝置物件結構device object,這裡簡略了兩個結構體中的成員,具體的網上都是,自己去搜吧 1 typedef struct driver objectdriver ...
程序和程式的區別?
首先,在談程序和程式的區別時,我們先來了解一下,何為程序?何為程式?何為程式?主要從兩方面解釋 1.是完成特定任務的一系列指令的集合 2.是指編譯好的二進位制檔案,在磁碟上,不占用系統資源 cpu,記憶體,開啟的檔案,裝置,鎖 何為程序?1.從使用者角度 程序是程式的一次動態執行過程 2.從核心角度...