5.進(jìn)程:
(1)在Win32系統(tǒng)中每一個(gè)進(jìn)程都擁有4GB的地址空間。Win32進(jìn)程什么也不執(zhí)行,它只是擁有4GB的地址空間來(lái)存放應(yīng)用程序EXE文件所需要的代碼和數(shù)據(jù)。除地址空間外,進(jìn)程還擁有文件、動(dòng)態(tài)內(nèi)存、線程等資源。由線程負(fù)責(zé)執(zhí)行包含在進(jìn)程地址空間里的代碼。每一個(gè)線程有它自己的CPU寄存器組和自己的棧。每一個(gè)進(jìn)程至少有一個(gè)線程來(lái)執(zhí)行包含在地址空間中的代碼。如果地址空間中沒(méi)有線程在執(zhí)行代碼,那么系統(tǒng)就會(huì)釋放進(jìn)程和它的地址空間。
(2)加載器:Win32支持兩類應(yīng)用程序,控制臺(tái)應(yīng)用程序CUI和圖形用戶界面應(yīng)用程序GUI。Exe文件中的一個(gè)子系統(tǒng)值指出這個(gè)應(yīng)用程序是控制臺(tái)應(yīng)用程序還是圖形用戶界面應(yīng)用程序。
(3)VC編寫的Win32控制臺(tái)應(yīng)用程序都有一個(gè)main函數(shù),而圖形界面應(yīng)用程序都有一個(gè)WinMain函數(shù)。
(4)C/C++的啟動(dòng)函數(shù):_WinMainCRTStartup函數(shù)。它負(fù)責(zé)執(zhí)行:
1.得到一個(gè)新進(jìn)程的全部命令行指針。
2.得到一個(gè)新進(jìn)程的環(huán)境變量指針。
3.通過(guò)包含Stdlib.h來(lái)初始化能被應(yīng)用程序訪問(wèn)的C運(yùn)行時(shí)全局變量。
4.初始化由C運(yùn)行時(shí)內(nèi)存分配函數(shù)使用的堆和其它的低級(jí)輸入輸出例程。
5調(diào)用WinMain函數(shù)。
6.當(dāng)WinMain返回后,啟動(dòng)代碼調(diào)用C運(yùn)行時(shí)的exit函數(shù),傳給它WinMain的返回值。Exit函數(shù)執(zhí)行一些清理工作,然后調(diào)用Win32的ExitProcess函數(shù),傳給它WinMain函數(shù)的返回值。
(5)實(shí)例句柄:每一個(gè)加載到進(jìn)程地址空間的Exe或DLL文件都有一個(gè)唯一的實(shí)例句柄。WinMain的第一個(gè)參數(shù)hinstExe是Exe文件的實(shí)例。在加載資源時(shí)所使用的函數(shù)要使用這個(gè)實(shí)例句柄。
(6)基本內(nèi)存地址:WinMain的參數(shù)hinstExe的實(shí)際值就是一個(gè)基本內(nèi)存地址。它指出系統(tǒng)是在什么地方把EXE文件的映象裝入進(jìn)程的地址空間的。基本內(nèi)存地址由鏈接器決定。
(7)HANDLE GetModuleHandle(LPCTSTR lpszModule)函數(shù):返回的句柄是EXE或DLL文件在地址空間里的基本地址。參數(shù)是Exe或DLL文件的名字。該函數(shù)的兩個(gè)需要注意的地方:一、該函數(shù)只查看調(diào)用進(jìn)程的地址空間。二、參數(shù)為NULL時(shí)返回的是EXE文件的基本內(nèi)存地址。
(8)在Win32下hinstExe和hmodExe是一個(gè)值。WinMain的參數(shù)hinstExePrev對(duì)于Win32無(wú)意義,它的值總為NULL。在Win32下,應(yīng)用程序的每一個(gè)實(shí)例都必須注冊(cè)它自己窗口類,這是因?yàn)榇翱陬惒荒鼙煌粦?yīng)用程序中的所有實(shí)例共享。只有hinstExePrev值為NULL時(shí),在Win32下應(yīng)用程序的每一個(gè)實(shí)例才會(huì)注冊(cè)它自己的窗口類。
(9)進(jìn)程的環(huán)境變量函數(shù):BOOL SetEnviromentVariable(LPCTSTR lpszName,LPCTSTR lpszValue);該函數(shù)把由lpszName標(biāo)識(shí)的值設(shè)置為由lpszValue標(biāo)識(shí)的值。如果指定的變量名已經(jīng)存在,就修改它的值。如果不存在,就增加該變量。如果lpszValue的值為NULL,變量就被從環(huán)境變量中刪除。
(10)進(jìn)程的命令行
(11)進(jìn)程的錯(cuò)誤模式:當(dāng)進(jìn)程出現(xiàn)錯(cuò)誤時(shí), 它用來(lái)告訴系統(tǒng)應(yīng)當(dāng)以何種模式去處理該錯(cuò)誤。使用的函數(shù)是:UINT SetErrorMode(UINT fuErrorMode);其中參數(shù)fuErrorMode是以下四個(gè)值的任意組合,它們是:SEM_FAILCRITICALERRORS(系統(tǒng)不顯示嚴(yán)重錯(cuò)誤處理消息框,把錯(cuò)誤返回調(diào)用的進(jìn)程)、SEM_NOGPFAULTERRORBOX(系統(tǒng)不顯示普通保護(hù)錯(cuò)誤消息框。該標(biāo)識(shí)只能被調(diào)試應(yīng)用程序設(shè)置來(lái)用異常句柄自己處理普通保護(hù)錯(cuò)誤GP)、SEM_NOOPENFILEERRORBOX(系統(tǒng)在找不到文件時(shí)不顯示消息框)、SEM_NOALIGNMENTFAULTEXCEPT(系統(tǒng)自動(dòng)修復(fù)內(nèi)在排列錯(cuò)誤,使它們對(duì)應(yīng)用不可見(jiàn)。該標(biāo)識(shí)對(duì)x86或Alpha處理器無(wú)用)。
注:缺省情況下子進(jìn)程會(huì)繼承父進(jìn)程的錯(cuò)誤模式。但是父進(jìn)程可以通過(guò)在調(diào)用CreateProcess時(shí)設(shè)置CREATE_DEFAULT_ERROR_MODE標(biāo)識(shí)來(lái)防止子進(jìn)程繼承。
(12)進(jìn)程的當(dāng)前驅(qū)動(dòng)器和目錄:可以使用下列函數(shù)來(lái)得到和設(shè)置進(jìn)程的當(dāng)前驅(qū)動(dòng)器和目錄:DWORD GetCurrentDirectory(DWORD cchCurDir,LPCTSTR lpszCurDir);
BOOL SetCurrentDirectory(LPCTSTR lpszCurDir);
(13)系統(tǒng)版本號(hào):一般使用 BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInformation);來(lái)得到系統(tǒng)版本號(hào),其中參數(shù)lpVersionInformation是一個(gè)LPOSVERSIONINFO結(jié)構(gòu),該結(jié)構(gòu)的定義如下:
typedef struct{
DWORD dwOSVersionInfoSize;//在調(diào)用GetVersionEx函數(shù)前必須被設(shè)置為:SizeOf(OSVERSIONINFO);
DWORD dwMajorVersion;//系統(tǒng)主版本號(hào)
DWORD dwMinorVersion;//系統(tǒng)次版本號(hào)
DWORD dwBuildNumber;
DWORD dwPlatformID;//標(biāo)識(shí)當(dāng)前系統(tǒng)支持的平臺(tái)
TCHAR szCSDVersion[128];
}OSVERSIONINFO,*LPOSVERSIONINFO;
(14)CreateProcess函數(shù):應(yīng)用程序調(diào)用CreateProcess函數(shù)來(lái)創(chuàng)建一個(gè)進(jìn)程。
BOOL CreateProcess(
LPCTSTR lpszApplicationName,
LPCTSTR lpszCommandLine,
LPSECURITY_ATTRIBUTES lpsaProcess,
LPSECURITY_ATTRIBUTES lpsaThread,
BOOL fInheritHandles,
DWORD fdwCreate,
LPVOID lpvEnvironment,
LPTSTR lpszCurDir,
LPSTARTUPINFO lpsiStartInfo,
LPPROCESS_INFORMATION lppiProcInfo
);
當(dāng)應(yīng)用程序中某個(gè)線程調(diào)用這個(gè)函數(shù)時(shí),系統(tǒng)創(chuàng)建了一個(gè)引用計(jì)數(shù)為1的進(jìn)程內(nèi)核對(duì)象。該內(nèi)核對(duì)象不是進(jìn)程,而是操作系統(tǒng)用來(lái)管理進(jìn)程的一小塊數(shù)據(jù)結(jié)構(gòu)。系統(tǒng)然后為新進(jìn)程創(chuàng)建一個(gè)4GB的虛擬地址空間,把可執(zhí)行文件和DLL及數(shù)據(jù)都裝入該地址空間。系統(tǒng)之后為新進(jìn)程的主線程創(chuàng)建一個(gè)使用計(jì)數(shù)為1的線程內(nèi)核對(duì)象,之后主線程開(kāi)始執(zhí)行C運(yùn)行時(shí)的啟動(dòng)代碼,最終會(huì)調(diào)用WinMain函數(shù)。如果系統(tǒng)成功地創(chuàng)建了新進(jìn)程和主線程,CreateProcess函數(shù)返回True。
各個(gè)參數(shù)說(shuō)明:
lpszCommandLine:該參數(shù)可以用來(lái)指定CreateProcess用來(lái)創(chuàng)建新進(jìn)程的完整命令行,這個(gè)命令行里可以包含“可執(zhí)行文件名”(如果這個(gè)可執(zhí)行文件沒(méi)有指定擴(kuò)展名的話,系統(tǒng)會(huì)認(rèn)為其擴(kuò)展名為exe)注:可以包含可執(zhí)行文件名+這個(gè)可執(zhí)行文件的完整路徑,如果未指定完整路徑,那么CreateProcess會(huì)以下面的順序查找可執(zhí)行文件:1.含有調(diào)用進(jìn)程的Exe文件目錄2調(diào)用進(jìn)程的當(dāng)前目錄3 Windows系統(tǒng)目錄4Windows目錄5列在PATH環(huán)境變量中的目錄。如果系統(tǒng)找到了可執(zhí)行文件,就創(chuàng)建一個(gè)進(jìn)程,把可執(zhí)行文件的代碼和DLL及數(shù)據(jù)裝入新進(jìn)程的地址空間。系統(tǒng)然后調(diào)用C運(yùn)行時(shí)的啟動(dòng)例程。之后C運(yùn)行時(shí)的啟動(dòng)例程會(huì)查看進(jìn)程的命令行,把可執(zhí)行文件名后的第一個(gè)參數(shù)地址傳遞為WinMain的lpszCmdLine參數(shù)。上面講述的情況是在參數(shù)lpszApplicationName為NULL時(shí)。
lpszApplicationName:可執(zhí)行文件的名稱及其擴(kuò)展名。如果不指定擴(kuò)展名那么系統(tǒng)將不會(huì)認(rèn)為其擴(kuò)展名為exe。如果不指定可執(zhí)行文件的路徑,那么CreateProcess只在當(dāng)前目錄下查找可執(zhí)行文件,如果找不到它將返回失敗。
下面列舉一例說(shuō)明上面講的兩個(gè)參數(shù),CreateProcess(“C:WINNTSYSTEM32NOTEPAD.EXE”,”WORDPAD README.TXT”…..);
系統(tǒng)將啟動(dòng)NotePad,但是NotePad的命令行是WORDPAD README.TXT這樣寫主要是為了支持Windows NT的POSIX子系統(tǒng)。
posted on 2010-05-21 14:23
水 閱讀(852)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Windows開(kāi)發(fā)