青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

windows核心編程--進程

進程通常被定義為一個正在運行的程序的實例,它由兩個部分組成:

• 一個是操作系統用來管理進程的內核對象。內核對象也是系統用來存放關于進程的統計信息的地方。
• 另一個是地址空間,它包含所有可執行模塊或 D L L 模塊的代碼和數據。它還包含動態內存分配的空間。如線程堆棧和堆分配空間。  

進程是不活潑的。若要使進程完成某項操作,它必須擁有一個在它的環境中運行的線程,該線程負責執行包含在進程的地址空間中的代碼。
當創建一個進程時,系統會自動創建它的第一個線程,稱為主線程。然后,該線程可以創建其他的線程,而這些線程又能創建更多的線程。

進程的實例句柄  

加載到進程地址空間的每個可執行文件或 D L L 文件均被賦予一個獨一無二的實例句柄。可執行文件的實例作為 ( w ) Wi n M a i n 的第一個參數 h i n s t E x e 來傳遞。對于加載資源的函數調用來說,通常都需要該句柄的值。例如,若要從可執行文件的映象來加載圖標資源,需要調用下面這個函數:

HICON LoadIcon( HINSTANCE hinst, PCTSTR pszIcon);

L o a d I c o n 的第一個參數用于指明哪個文件(可執行文件或 D L L 文件)包含你想加載的資源。

注意 : 實際情況說明, H M O D U L E 與 H I N S TA N C E 是完全相同的對象。如果函數的文檔指明需要一個 H M O D U L E ,那么可以傳遞一個 H I N S TA N C E ,反過來,如果需要一個 H I N S TA N C E ,也可以傳遞一個 H M O D U L E 。之所以存在兩個數據類型,原因是在 1 6 位 Wi n d o w s 中, H M O D U L E 和 H I N S TA N C E 用于標識不同的東西。

G e t M o d u l e H a n d l e 函數返回可執行文件或 D L L 文件加載到進程的地址空間時所用的句柄 / 基地址:

HMODULE GetModuleHandle( PCTSTR pszModule);

當調用該函數時,你傳遞一個以 0 結尾的字符串,用于設定加載到調用進程的地址空間的可執行文件或 D L L 文件的名字。如果系統找到了指定的可 執行文件或 D L L 文件名, G e t M o d u l e H a n d l e 便返回該可執行文件或 D L L 文件映象加載到的基地址。如果系統沒有找到該文件,則 返回 N U L L 。也可以調用 G e t M o d u l e H a n d l e ,為 p s z M o d u l e 參數傳遞 N U L L , G e t M o d u l e H a n d l e 返回調 用的可執行文件的基地址。  

進程的命令行

當一個新進程創建時,它要傳遞一個命令行。該命令行幾乎永遠不會是空的,至少用于創建新進程的可執行文件的名字是命令行上的第一個標記。當 C 運行期的啟動代碼開始運行的時候,它要檢索進程的命令行,跳過可執行文件的名字,并將指向命令行其余部分的指針傳遞給 Wi n M a i n 的 p s z C m d L i n e 參數。

進程的環境變量

每個進程都有一個與它相關的環境塊。環境塊是進程的地址空間中分配的一個內存塊。每個環境塊都包含一組字符串,其形式如下:

VarName1=VarValue1\0

VarName2=VarValue2\0

VarName3=VarValue3\0

...

VarNameX=VarValueX\0

\0

每個字符串的第一部分是環境變量的名字,后跟一個等號,等號后面是要賦予變量的值。

DWORD GetEnvironmentVariable(

   PCTSTR pszName,

   PTSTR pszValue,

   DWORD cchValue);

當調用 G e t E n v i r o n m e n t Va r i a b l e 時, p s z N a m e 指向需要的變量名, p s z Va l u e 指向用于存放變量值的緩存, c c h Va l u e 用于指明緩存的大小(用字符數來表示)。該函數可以返回拷貝到緩存的字符數,如果在環境中找不到該變量名,也可以返回 0 。

BOOL SetEnvironmentVariable(

   PCTSTR pszName,

   PCTSTR pszValue);

該函數用于將 p s z N a m e 參數標識的變量設置為 p s z Va l u e 參數標識的值。如果帶有指定名字的變量已經存在, S e t E n v i r o n m e n t Va r i a b l e 就修改該值。如果指定的變量不存在,便添加該變量,如果 p s z Va l u e 是 N U L L ,便從環境塊中刪除該變量。

進程的親緣性

一般來說,進程中的線程可以在主計算機中的任何一個 C P U 上執行。但是一個進程的線程可能被強制在可用 C P U 的子集上運行。這稱為進程的親緣性,

進程的錯誤模式

進程可以告訴系統如何處理每一種錯誤。方法是調用 S e t E r r o r M o d e 函數:

UINT SetErrorMode(UINT fuErrorMode);

f u E r r o r M o d e 參數是表 4 - 3 的任何標志按位用 O R 連接在一起的組合。

表4-3 fuError Mode 參數的標志

標志
 說明
 
SEM_FAILCRITICALERRORS
 系統不顯示關鍵錯誤句柄消息框,并將錯誤返回給調用進程
 
SEM_NOGOFAULTERRORBOX
 系統不顯示一般保護故障消息框。本標志只應該由采用異常情況處理程序來處理一般保護(G P)故障的調試應用程序來設定
 
SEM_NOOPENFILEERRORBOX
 當系統找不到文件時,它不顯示消息框
 
SEM_NOALIGNMENTFAULTEXCEPT
 系統自動排除內存沒有對齊的故障,并使應用程序看不到這些故障。本標志對x 8 6處理器不起作用
 

進程的當前驅動器和目錄

通過調用下面兩個函數,線程能夠獲得和設置它的進程的當前驅動器和目錄:
  
DWORD GetCurrentDirectory(
   DWORD cchCurDir,
   PTSTR pszCurDir);
BOOL SetCurrentDirectory(PCTSTR pszCurDir);
CreateProcess 函數

可以用 C r e a t e P r o c e s s 函數創建一個進程:

BOOL CreateProcess(

   PCTSTR pszApplicationName,

   PTSTR pszCommandLine,

   PSECURITY_ATTRIBUTES psaProcess,

   PSECURITY_ATTRIBUTES psaThread,

   BOOL bInheritHandles,

   DWORD fdwCreate,

   PVOID pvEnvironment,

   PCTSTR pszCurDir,

   PSTARTUPINFO psiStartInfo,

   PPROCESS_INFORMATION ppiProcInfo);

當一個線程調用 CreateProcess 時,系統就會創建一個進程內核對象,其初始使用計數是 1 。

當第一個參數為 NULL 時 , C r e a t e P r o c e s s 也按下面的順序搜索該可執行文件:

1) 包含調用進程的 . e x e 文件的目錄。

2) 調用進程的當前目錄。

3) Wi n d o w s 的系統目錄。

4) Wi n d o w s 目錄。

5) PAT H 環境變量中列出的目錄。

當然,如果文件名包含全路徑,系統將使用全路徑來查看可執行文件,并且不再搜索這些目錄。如果系統找到了可執行文件,那么它就創建一個新進程,并將可執行文件的代碼和數據映射到新進程的地址空間中。然后系統將調用 C / C + + 運行期啟動例程。正如前面我們講過的那樣, C / C + + 運行期啟動例程要查看進程的命令行,并將地址作為 ( w ) Wi n M a i n 的 p s z C m d L i n e 參數傳遞給可執行文件的名字后面的第一個參數。

終止進程的運行

若要終止進程的運行,可以使用下面四種方法:  

• 主線程的進入點函數返回(最好使用這個方法)。  

• 進程中的一個線程調用 E x i t P r o c e s s 函數(應該避免使用這種方法)。  

• 另一個進程中的線程調用 Te r m i n a t e P r o c e s s 函數(應該避免使用這種方法)。  

• 進程中的所有線程自行終止運行(這種情況幾乎從未發生)。  

主線程的進入點函數返回

始終都應該這樣來設計應用程序,即只有當主線程的進入點函數返回時,它的進程才終止運行。這是保證所有線程資源能夠得到正確清除的唯一辦法。讓主線程的進入點函數返回,可以確保下列操作的實現:

• 該線程創建的任何 C + + 對象將能使用它們的析構函數正確地撤消。  

• 操作系統將能正確地釋放該線程的堆棧使用的內存。  

• 系統將進程的退出代碼(在進程的內核對象中維護)設置為進入點函數的返回值。  

• 系統將進程內核對象的返回值遞減 1 。

ExitProcess 函數

當進程中的一個線程調用 E x i t P r o c e s s 函數時,進程便終止運行:
    
VOID ExitProcess(UINT fuExitCode);    
  
當主線程的進入點函數( WinMain 、 wWinMain 、 main 或 wmain )返回時,它將返回給 C / C + + 運行期啟動代碼,它能正確地清除該進程使用的所有的 C 運行期資源。當 C 運行期資源被釋放之后, C 運行期啟動代碼就顯式調用 E x i t P r o c e s s ,并將進入點函數返回的值傳遞給它。這解釋了為什么只需要主線程的進入點函數返回,就能夠終止整個進程的運行。請注意,進程中運行的任何其他線程都隨著進程而一道終止運行。

注意,調用 E x i t P r o c e s s 或 E x i t T h r e a d 可使進程或線程在函數中就終止運行。就操作系統而言,這很好,進程或線程的所有操作系統資源都將被全部清除。但是, C / C + + 應用程序應該避免調用這些函數,因為 C / C + + 運行期也許無法正確地清除。

TerminateProcess 函數

調用 Te r m i n a t e P r o c e s s 函數也能夠終止進程的運行:

BOOL TerminateProcess(HANDLE hProcess, UINT fuExitCode);

該函數與 E x i t P r o c e s s 有一個很大的差別,那就是任何線程都可以調用 Te r m i n a t e P r o c e s s 來終止另一個進程或它自己的進程的運行。 h P r o c e s s 參數用于標識要終止運行的進程的句柄。

只有當無法用另一種方法來迫使進程退出時,才應該使用 Te r m i n a t e P r o c e s s 。終止運行的進程絕對得不到關于它將終止運行的任何通知,因為應用程序無法正確地清除,并且不能避免自己被撤消(除非通過正常的安全機制)。

進程終止運行時出現的情況

當進程終止運行時,下列操作將啟動運行:  

1) 進程中剩余的所有線程全部終止運行。  

2) 進程指定的所有用戶對象和 G D I 對象均被釋放,所有內核對象均被關閉(如果沒有其他 進程打開它們的句柄,那么這些內核對象將被撤消。但是,如果其他進程打開了它們的句柄, 內核對象將不會撤消)。  

3) 進程的退出代碼將從 S T I L L _ A C T I V E 改為傳遞給 E x i t P r o c e s s 或 Te r m i n a t e P r o c e s s 的代碼。  

4) 進程內核對象的狀態變成收到通知的狀態(關于傳送通知的詳細說明,參見第 9 章)。系 統中的其他線程可以掛起,直到進程終止運行。  

5) 進程內核對象的使用計數遞減 1 。

注意,進程的內核對象的壽命至少可以達到進程本身那么長,但是進程內核對象的壽命可能大大超過它的進程壽命。當進程終止運行時,系統能夠自動確定它的內核對象的使用計數。如果使用計數降為 0 ,那么沒有其他進程擁有該對象打開的句柄,當進程被撤消時,對象也被撤消。

子進程

子進程 , 能夠處理比線程更復雜的東西 , 也能夠保持相對的獨立 , 但是就會有進程間的數據共享 , Wi n d o w s 提供了若干種方法,以便在不同的進程中間傳送數據,比如動態數據交換( D D E )、 O L E 、管道和郵箱等。共享數據最方便的方法之一是,使用內存映射文件 . 大多數情況下,應用程序將另一個進程作為獨立的進程來啟動。這意味著進程創建和開始運行后,父進程并不需要與新進程進行通信,也不需要在完成它的工作后父進程才能繼續運行。這就是 E x p l o r e r 的運行方式。當 E x p l o r e r 為用戶創建一個新進程后,它并不關心該進程是否繼續運行,也不在乎用戶是否終止它的運行。

若要放棄與子進程的所有聯系, E x p l o r e r 必須通過調用 C l o s e H a n d l e 來關閉它與新進程及它的主線程之間的句柄。下面的代碼示例顯示了如何創建新進程以及如何讓它以獨立方式來運行:


PROCESS_INFORMATION pi;
//Spawn the child process.
BOOL fSuccess = CreateProcess(..., π);
if(fSuccess)
{
   //Allow the system to destroy the process & thread kernel
   //objects as soon as the child process terminates.
   CloseHandle(pi.hThread);
   CloseHandle(pi.hProcess);
}

posted on 2006-09-12 14:38 夢在天涯 閱讀(1961) 評論(0)  編輯 收藏 引用 所屬分類: Windows API

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1814998
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              国产精品一区在线观看| 欧美日韩在线播放一区| 免费观看一级特黄欧美大片| 欧美日本簧片| 亚洲国产国产亚洲一二三| 欧美亚洲一区二区三区| 亚洲毛片在线观看.| 老司机成人在线视频| 国产午夜精品理论片a级探花| 亚洲精选成人| 亚洲第一搞黄网站| 久久性天堂网| 黄色成人在线网址| 久久久久久一区二区三区| 亚洲男女自偷自拍图片另类| 欧美日韩中文字幕精品| 日韩午夜在线电影| 亚洲啪啪91| 欧美激情中文字幕在线| 亚洲另类视频| 99亚洲一区二区| 欧美视频一二三区| 亚洲男人第一网站| 在线亚洲自拍| 国产精品网红福利| 久久久久国产精品www | 鲁大师影院一区二区三区| 国内一区二区在线视频观看| 久久久久**毛片大全| 久久乐国产精品| 久久久久久夜| 亚洲国产专区校园欧美| 最新中文字幕亚洲| 国产精品豆花视频| 久久免费的精品国产v∧| 另类综合日韩欧美亚洲| 在线视频欧美精品| 亚洲欧美日韩综合aⅴ视频| 在线观看欧美日韩| 亚洲精品一区二区网址| 99精品黄色片免费大全| 国产美女精品免费电影| 麻豆成人在线播放| 欧美精品麻豆| 欧美在线一二三四区| 久久精品一区中文字幕| 亚洲乱码国产乱码精品精98午夜| 99精品视频免费观看视频| 国产精品私房写真福利视频| 噜噜噜在线观看免费视频日韩| 欧美大片第1页| 午夜在线观看免费一区| 另类av导航| 亚洲欧美欧美一区二区三区| 久久精品91久久久久久再现| 亚洲素人一区二区| 久久夜色精品国产亚洲aⅴ | 欧美亚洲视频一区二区| 久久午夜电影| 亚洲欧美日韩国产中文| 美女视频网站黄色亚洲| 午夜精品在线| 欧美va亚洲va国产综合| 久久av一区二区三区漫画| 欧美多人爱爱视频网站| 久久久亚洲国产天美传媒修理工| 欧美日韩在线播放| 欧美肥婆在线| 国内外成人在线视频| 亚洲一区www| 日韩西西人体444www| 久久视频免费观看| 久久精品夜色噜噜亚洲aⅴ| 欧美三级欧美一级| 亚洲黄色在线观看| 韩曰欧美视频免费观看| 亚洲尤物在线| 亚洲一区二区高清| 欧美日韩国产bt| 亚洲欧美国产视频| 欧美激情视频网站| 欧美成人第一页| 一区二区亚洲精品国产| 欧美亚洲三区| 久久国产精品72免费观看| 国产精品午夜国产小视频| 亚洲一区黄色| 欧美在线一区二区三区| 国产一区二区精品久久99| 欧美在线你懂的| 久久天天躁狠狠躁夜夜爽蜜月| 国产亚洲一区二区精品| 性久久久久久久久久久久| 久久久999精品| 尤物九九久久国产精品的特点| 久久性天堂网| 亚洲欧洲中文日韩久久av乱码| 日韩视频在线观看一区二区| 欧美精品 日韩| 在线中文字幕日韩| 欧美在线二区| 国产一区视频观看| 欧美一二区视频| 国产精品入口尤物| 亚洲高清色综合| 亚洲乱亚洲高清| 欧美劲爆第一页| 99精品视频一区二区三区| 亚洲欧美国内爽妇网| 国产性猛交xxxx免费看久久| 久久av一区二区| 免费视频一区二区三区在线观看| 一色屋精品视频免费看| 久久久99精品免费观看不卡| 欧美国产激情| 亚洲美女电影在线| 欧美女同视频| 欧美一区二区三区四区高清| 欧美在线观看一区二区三区| 国产精品尤物| 亚洲国产精品一区二区久| 亚洲精品国产精品国自产观看浪潮| 蜜桃久久av一区| 亚洲久久一区二区| 亚洲欧美美女| 亚洲国产一区二区在线| 亚洲欧美视频在线观看| 国产精品自在欧美一区| 性感少妇一区| 欧美成人一区二区三区片免费| 亚洲欧洲精品一区二区| 国产精品一区二区你懂的| 久久成人一区二区| 欧美韩日一区二区| 这里只有精品在线播放| 国产欧美日韩综合一区在线观看 | 久久婷婷av| 亚洲精品国产精品乱码不99按摩| 欧美激情中文字幕乱码免费| 一区二区精品国产| 欧美一区二区三区免费视频| 一区二区三区在线免费观看| 欧美精品国产精品| 亚洲一区日韩| 欧美成人黑人xx视频免费观看| 亚洲电影免费观看高清完整版| 欧美日韩日韩| 久久riav二区三区| 亚洲伦理久久| 久久综合伊人77777麻豆| 狠狠色2019综合网| 国产精品久久久久久模特| 久久精品一级爱片| 日韩午夜三级在线| 开心色5月久久精品| 日韩午夜在线播放| 亚洲激情图片小说视频| 国产精品欧美日韩久久| 蜜臀a∨国产成人精品| 亚洲永久精品大片| 亚洲精品美女久久久久| 亚洲二区视频在线| 久久精品国产成人| 亚洲国产精品电影| 国产亚洲综合在线| 国产精品成人午夜| 欧美激情精品久久久久久| 午夜免费日韩视频| 亚洲精品日韩激情在线电影| 欧美激情第9页| 久久国产欧美精品| 欧美精品在欧美一区二区少妇| 久久久中精品2020中文| 亚洲影视在线播放| 亚洲精品中文字幕女同| 亚洲综合清纯丝袜自拍| 亚洲网站在线| 亚洲国产日韩欧美在线99| 国产亚洲在线| 国产欧美精品国产国产专区| 欧美精品激情在线| 久久噜噜噜精品国产亚洲综合| 亚洲——在线| 亚洲视频专区在线| 亚洲美女少妇无套啪啪呻吟| 99re6热只有精品免费观看| 欧美肥婆在线| 欧美成人精品一区二区三区| 久久视频在线视频| 欧美在线亚洲综合一区| 久久婷婷国产综合精品青草| 欧美在线高清视频| 亚洲视频久久| 亚洲午夜日本在线观看| 一区二区三区日韩精品视频| 亚洲精品一区在线观看| 99国产精品久久久久老师| 亚洲精品国产无天堂网2021| 亚洲精品123区| 国产精品一区二区久久国产|