程序和Windows程式的基本概述

2021-05-22 00:54:14 字數 3110 閱讀 2796

一般程序可以定為乙個正在執行的程式的乙個例項,

乙個核心物件,作業系統可以用它來管理程序。也是系統儲存程序統計資訊的地方。

乙個位址空間,其中包含了可執行檔案和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.從核心角度...