• <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>
            xi52qian  
            xi52qian
            日歷
            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789
            統(tǒng)計(jì)
            • 隨筆 - 4
            • 文章 - 0
            • 評(píng)論 - 1
            • 引用 - 0

            導(dǎo)航

            常用鏈接

            留言簿

            隨筆檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

             

            進(jìn)程由兩部分組成:

            • 操作系統(tǒng)管理進(jìn)程的內(nèi)核對(duì)象。存放該進(jìn)程 的統(tǒng)計(jì)信息的地方。
            • 地址空間,包含可執(zhí)行模塊和DLL模塊的代碼和數(shù)據(jù)。動(dòng)態(tài)分配的內(nèi)存(線程堆棧和堆)。

            進(jìn)程是不活潑的,進(jìn)程當(dāng)中至少要有一個(gè)線程,每個(gè)線程要有自己的堆棧和自己的CPU寄存器。CPU通過(guò)算法給每個(gè)線程分配時(shí)間片的辦法來(lái)造成假象是在同時(shí)工作(多核通過(guò)自己的算法實(shí)現(xiàn)同時(shí)運(yùn)行)。

            4.1 編寫(xiě)第一個(gè)Windiws應(yīng)用程序

            Windows兩種類(lèi)型的程序:

            • CUI程序,比如CMD.EXE等等。Microsoft Visual C++連接開(kāi)關(guān)為/SUBSYSTEM:CONDOLE(程序啟動(dòng)時(shí)不能創(chuàng)建GUI程序)。
            • GUI程序,圖形用戶程序,比如Notepad,Word等等。Microsoft Visual C++連接開(kāi)關(guān)為/SUBSYSTEM:WINDOWS(程序啟動(dòng)時(shí)不能創(chuàng)建CUI程序)。

            注意:倆者的概念其實(shí)是很模糊的,CUI可以創(chuàng)建GUI圖形界面,反之GUI程序可能用CUI程序。

            Windows進(jìn)入點(diǎn)函數(shù)(區(qū)分在于CUI和GUI程序,ANSI碼和UNICODE碼)

            int WINAPI WinMain(
            HINSTANCE hinstExe,
            HINSTANCE,
            PSTR pszCmdLine,
            int nCmdShow);
            
            int WINAPI wWinMain(
            HINSTANCE hinstExe,
            HINSTANCE,
            PWSTR pszCmdLine,
            int nCmdShow);
            
            int __cdecl main(
            int argc,
            char *argv[],
            char *envp[]);
            
            int __cdecl wmain(
            int argc,
            wchar_t *argv[],
            wchar_t *envp[]);

            其實(shí)Windows程序啟動(dòng)時(shí)最開(kāi)始并不調(diào)用自己寫(xiě)的入口函數(shù),而是調(diào)用系統(tǒng)的幾個(gè)入口函數(shù),以便可以調(diào)用malloc和free之類(lèi)的函數(shù),初始化全局和靜態(tài)C++對(duì)象等。

            • 檢索指向新進(jìn)程的完整命令行的指針。
            • 檢索指向新進(jìn)程的環(huán)境變量的指針。
            • 對(duì)C/C++運(yùn)行期的全局變量進(jìn)行初始化。如果包含StdLib.h文件,代碼就可以訪問(wèn)這些變量。
            • 對(duì)C運(yùn)行期的malloc和callo和其他底層輸入/輸出例程使用的內(nèi)存棧進(jìn)行初始化。
            • 為所有全局和靜態(tài)C++類(lèi)對(duì)象調(diào)用構(gòu)造函數(shù)。

              應(yīng)用程序類(lèi)型                            進(jìn)入點(diǎn)                                                     嵌入可執(zhí)行文件的啟動(dòng)函數(shù)


            ANSI碼GUI應(yīng)用程序                   WinMain                                               WinMainCRTStattup

            UNICODE碼GUI應(yīng)用程序           wWinMain                                            wWinMainCRTStattup

            ANSI碼CUI應(yīng)用程序                   main                                                       mainCRTStattup

            UNICODE碼CUI應(yīng)用程序           wmain                                                    wmainCRTStattup


            注意:應(yīng)用程序會(huì)根據(jù)SUBSYSTEM開(kāi)關(guān)來(lái)查找嵌入可執(zhí)行啟動(dòng)函數(shù),如果進(jìn)入點(diǎn)函數(shù)和啟動(dòng)函數(shù)不匹配則顯示鏈接錯(cuò)誤。可以刪除SUBSYSTEM(VS Project Settings)開(kāi)關(guān),這樣應(yīng)用程序會(huì)自動(dòng)需找匹配的函數(shù)。

            進(jìn)入點(diǎn)函數(shù)返回時(shí)調(diào)用系統(tǒng)的exit函數(shù),將返回值傳遞給它。exit函數(shù)負(fù)責(zé)下面操作:

            • 調(diào)用由_onexit函數(shù)的調(diào)用而注冊(cè)的任何函數(shù)。
            • 為所有全局的和靜態(tài)的C++類(lèi)對(duì)象調(diào)用析構(gòu)函數(shù)
            • 調(diào)用操作系統(tǒng)的ExitProcess,并將返回值傳遞給他,關(guān)閉進(jìn)程。

            4.1.1 進(jìn)程的實(shí)例句柄

            WinMain/wWinMain函數(shù)的第一個(gè)參數(shù)表示進(jìn)程加載的可執(zhí)行文件的基地址/句柄。對(duì)于加載資源的調(diào)用都要使用此句柄,比如HICON LoadIcon(HINSTANCE, PCTSTR)。有的函數(shù)需要使用HMODULE,和HINSTANCE是一個(gè)意思(區(qū)分主要在于16位的操作系統(tǒng)中)。

            HMODULE GetModuleHandle(PCTSTR pszModele);

            函數(shù)作用,返回加載調(diào)用進(jìn)程中的可執(zhí)行文件或者DLL的基地址/句柄,參數(shù)是可執(zhí)行文件或者DLL的名稱。給pszModule賦值NULL,則返回的是進(jìn)程中可執(zhí)行文件的句柄。

            注意:如果找不到則返回NULL。如果在DLL中傳遞NULL,返回的仍然是進(jìn)程加載的可執(zhí)行文件的句柄。

            4.1.2 進(jìn)程的前一個(gè)實(shí)例句柄

            第二個(gè)參數(shù)都傳遞NULL,是為16位系統(tǒng)所保留的。

            4.1.3 進(jìn)程的命令行

            注意:不要試圖修改命令行內(nèi)部?jī)?nèi)存的值,要使用修改先拷貝出來(lái)。

            PTSTR GetCommandLine(); // 返回命令行字符串
             
            PTSTR CommandLineToArgv(PTSTR pszCmdLine, int *pNumArgs); // 拆分命令行字符串函數(shù)

            Demo:

            int nNumargs;
            PTSTR *ppArgv = CommandLineToArgv(GetCommandLine(), &nNumargs);
            if ('x' == *ppArgv[1]) {
            // TODO:
            }
            
            // 手動(dòng)釋放內(nèi)存,一般不需要釋放,系統(tǒng)會(huì)進(jìn)程關(guān)閉時(shí)候自動(dòng)釋放
            HeapFree(GetProcessHeap, 0, ppArgv);


            4.1.4 進(jìn)程的環(huán)境變量

            環(huán)境塊是進(jìn)程地址空間中分配的內(nèi)存塊每個(gè)環(huán)境塊都包含一組字符串,格式如下:

            VarName1=VarVarlue1\0

            VarName2=VarVarlue2\0

            VarName3=VarVarlue3\0

            …..

            VarNameX=VarVarlueX\0

            \0

            注意:

            • 排序必須按照字母順序。
            • ‘=’號(hào)不能是變量名的一部分。
            • 等號(hào)左右兩邊的空格將被算做名稱或者值。
            • 最后必須加個(gè)’\0’表示結(jié)束。
            • 子進(jìn)程和父進(jìn)程不共用環(huán)境塊,修改不會(huì)影響父/子進(jìn)程。
            DWORD GetEnvironmentVariable(PCTSTR pszName, PTSTR pszValue, DWORD cchValue);


            pszName指變量名,pszValue指向變量值的緩存區(qū),cchValue緩存區(qū)的大小。找不到變量名或者設(shè)置的長(zhǎng)度不夠存放就返回0。

             

            ExpandEnvironmentStrings(PCSTR pszSrc, PSTR pszDst, DWORD nSize);

            用來(lái)用現(xiàn)實(shí)出可替換的環(huán)境變量的字符串。

            BOOL SetEnvironmentVariable(PCTSTR pszName, PCTSTR pszValue);

            設(shè)置環(huán)境變量的值,如果不存在則創(chuàng)建,如果存在則替換他的值。

            4.1.5 進(jìn)程的親緣性

            子進(jìn)程繼承父進(jìn)程的親緣性。(具體什么意思沒(méi)明白)

            4.1.6 進(jìn)程的錯(cuò)誤模式

            進(jìn)程可以設(shè)置如何處理一些錯(cuò)誤。

            UINT SetErrorMode(UINT fuErrorMode);


            各個(gè)模式用OR連接


                  標(biāo)志                                                                                                               說(shuō)明

            SEM_FAILCRITICALERRORS                                                                    系統(tǒng)不顯示關(guān)鍵錯(cuò)誤句柄消息框,并將錯(cuò)誤返回給調(diào)用進(jìn)程

            SEM_NOGOFAULTERRORBOX                                                               系統(tǒng)不顯示一般保護(hù)故障消息框。本標(biāo)志只應(yīng)該由采用異常情況處理程序來(lái)處理一般保護(hù)(GP)故障的調(diào)式應(yīng)用程式來(lái)設(shè)定

            SEM_NOOPENFILEERRORBOX                                                               當(dāng)系統(tǒng)找不到文件時(shí),它不顯示消息框。

            SEM_NOALIGNMENTFAULTEXCEPT                                                    系統(tǒng)自動(dòng)排除內(nèi)存沒(méi)有對(duì)其的故障,并使應(yīng)用程序看不到這些故障。本標(biāo)志對(duì)X86處理器不起作用。


            子進(jìn)程繼承父進(jìn)程的錯(cuò)誤模式,如果不想讓子進(jìn)程繼承父進(jìn)程的錯(cuò)誤模式的話,可以再調(diào)用CreateProcess時(shí)設(shè)定CREATE_DEFAULT_ERROR_MODE標(biāo)志。

            4.1.7 進(jìn)程的當(dāng)前驅(qū)動(dòng)器和目錄

            默認(rèn)情況下不提供全路徑的話,系統(tǒng)就會(huì)在當(dāng)前驅(qū)動(dòng)器和目錄中查找文件,比如CreateFile,因?yàn)轵?qū)動(dòng)器和目錄是每個(gè)進(jìn)程來(lái)維護(hù)的,所以某個(gè)線程改變了目錄和驅(qū)動(dòng)器會(huì)改變整個(gè)進(jìn)程的目錄和驅(qū)動(dòng)器。

            下面兩個(gè)函數(shù)讀取和設(shè)置:

            DWORD GetCurrentDirectory(DWORD cchCurDir, PTSTR pszCurDir);
            
            BOOL SetCurrentDirectory(PCTSTR pszCurDir);

            4.1.8 進(jìn)程的當(dāng)前目錄

            驅(qū)動(dòng)器環(huán)境塊的格式:

            =C:=C:\Utility\Bin

            程序查找驅(qū)動(dòng)器環(huán)境塊,如果沒(méi)有則按驅(qū)動(dòng)器名查找。

            子進(jìn)程不能繼承父進(jìn)程的驅(qū)動(dòng)器塊,如果想繼承必須寫(xiě)到環(huán)境變量中去。(好像是這樣,如果有不對(duì)請(qǐng)高人指點(diǎn))。

            DWORD GetFullPathName(PCTSTR pszFile, DWORD cchPath, PTSTR pszPath, PTSTR *ppszFilePart);

            獲取驅(qū)動(dòng)器的當(dāng)前目錄,比如:

            TCHAR szCurDir[MAX_PATH];
            DWORD GetFullPathName(TEXT("C:"), MAX_PATH, szCurDir, NULL);


            4.1.9 系統(tǒng)版本

            DWORD GetVersion();此函數(shù)存在高地位的混論BUG,所以盡量不要使用。

            BOOL GetVersion(POSVERSIONINFOEX pVersionInfomation);
            typedef struct _OSVERSIONINFOEXA {
                DWORD dwOSVersionInfoSize;    // 在調(diào)用GetVersionEx函數(shù)之前,必必須置為sizeof(OSVERSIONINFOEX)
                DWORD dwMajorVersion;         // 主系統(tǒng)的主要版本號(hào)
                 DWORD dwMinorVersion;         // 主系統(tǒng)的次要版本號(hào)
                 DWORD dwBuildNumber;          // 當(dāng)前系統(tǒng)的構(gòu)建號(hào)
                 DWORD dwPlatformId;           // 識(shí)別當(dāng)前系統(tǒng)的平臺(tái)。可以使VER_PLATFORM_WIN32(WIN32),VER_PLATFORM_WIN32_WINDOWS(WINDOWS 95/WINDOWS 98),VER_PLATFORM_WIN32_NT(WINDOWS NT/WINDOWS 2000)或VER_PLATFORM_WIN32_CEHH(WINDOWS CE)
                CHAR   szCSDVersion[ 128 ];     // Maintenance string for PSS usage 本域包含了附加文本,用于提供關(guān)于已經(jīng)安裝的操作系統(tǒng)的詳細(xì)信息
                 WORD   wServicePackMajor;       // 最新安裝的服務(wù)程序包的主要版本號(hào)
                 WORD   wServicePackMinor;       // 最新安裝的服務(wù)程序包的次要版本號(hào)
                 WORD   wSuiteMask;              // 用于標(biāo)識(shí)系統(tǒng)上存在那個(gè)程序組(VER_SUITE_SMALLBUSINESS,VER_SUITE_ENTERPRISE,VER_SUITE_BACKOFFICE,VER_SUITE_COMMUNICATIONS,VER_SUITE_TERMINAL,VER_SUITE_SMALLBUSINESS_RESTRICTED,VER_SUITE_EMBEDDEDNT和VER_SUITE_DATACENTER)
                 BYTE  wProductType;             // 用于標(biāo)識(shí)安裝了下面的哪個(gè)操作系統(tǒng):VER_NT_WORKSTATION,VER_NT_SERVER或VER_NT_DOMAIN_CONTROLLER
                BYTE  wReserved;                // 留作將來(lái)使用
            } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;

            這個(gè)是擴(kuò)展版本。
             
            4.2 CreateProcess函數(shù)
            終于看到正題了~大笑
            BOOL CreateProcess(
                LPCSTR lpApplicationName,
                LPSTR lpCommandLine,
                LPSECURITY_ATTRIBUTES lpProcessAttributes,
                LPSECURITY_ATTRIBUTES lpThreadAttributes,
                BOOL bInheritHandles,
                DWORD dwCreationFlags,
                LPVOID lpEnvironment,
                LPCSTR lpCurrentDirectory,
                LPSTARTUPINFOA lpStartupInfo,
                LPPROCESS_INFORMATION lpProcessInformation
                );

            1. 進(jìn)程啟動(dòng)時(shí),首先創(chuàng)建一個(gè)進(jìn)程內(nèi)核對(duì)象,該內(nèi)核對(duì)象不是進(jìn)程,是一個(gè)管理進(jìn)程存儲(chǔ)進(jìn)程信息的小型數(shù)據(jù)結(jié)構(gòu)。(計(jì)數(shù)為1)
            2. 創(chuàng)建一個(gè)虛擬地址空間,加載可執(zhí)行文件和DLL。
            3. 為進(jìn)程創(chuàng)建個(gè)主線程的內(nèi)核對(duì)象,和進(jìn)程內(nèi)核對(duì)象一樣,是用來(lái)管理和存儲(chǔ)線程信息的小型數(shù)據(jù)結(jié)構(gòu)。(計(jì)數(shù)為1)
            4. 調(diào)用C/C++運(yùn)行期啟動(dòng)代碼,主線程開(kāi)始運(yùn)行,最終調(diào)用啟動(dòng)函數(shù),成功返回TRUE(未能正確加載DLL也返回TRUE,所以父進(jìn)程無(wú)法查看)。

            4.2.1 pszApplicationName和pszCommandLine

            pszCommandLine參數(shù):用來(lái)創(chuàng)建進(jìn)程的命令行參數(shù)。查看第一個(gè)標(biāo)記,如果沒(méi)有”.exe”會(huì)自動(dòng)添加”.exe”上去。(如果pszApplicationName參數(shù)NULL)

            1. 包含調(diào)用進(jìn)程的”.exe”文件的目錄。
            2. 調(diào)用進(jìn)程的當(dāng)前目錄。
            3. windows系統(tǒng)目錄
            4. windows目錄
            5. PATH環(huán)境變量中列出的目錄。

            如果pszApplicationName參數(shù)不為NULL,系統(tǒng)將在當(dāng)前目錄中查找.exe文件(不會(huì)自動(dòng)添加“.exe”),如果找不到將失敗,此時(shí)pszCommandLine作為參數(shù)傳遞給可執(zhí)行程序的進(jìn)程。

            4.2.2 psaProcess,psaThread和binHeritHandles

            psaProcess,psaThread是進(jìn)程和進(jìn)程主線程內(nèi)核對(duì)象的安全屬性。默認(rèn)值為NULL。

            binHeritHandles設(shè)置為T(mén)RUE表示父進(jìn)程在創(chuàng)建子進(jìn)程可以繼承安全屬性標(biāo)志里設(shè)置為T(mén)RUE的任何可繼承的內(nèi)核對(duì)象。如果設(shè)置為FALSE子進(jìn)程將不繼承任何內(nèi)核對(duì)象。

            4.2.3 fdwCreate

            用于標(biāo)識(shí)標(biāo)志,定義規(guī)則如何創(chuàng)建新進(jìn)程。我一般寫(xiě)默認(rèn)值NULL。具體的太多了,請(qǐng)查看MSDN吧,不想寫(xiě)了。

            4.2.4 pvEnvironment

            設(shè)置子進(jìn)程使用的環(huán)境內(nèi)存塊,一般默認(rèn)值為NULL,表示子進(jìn)程繼承父進(jìn)程的環(huán)境塊。

            PVOID GetEnvironmentString(); // 獲取當(dāng)前內(nèi)存塊的地址
            BOOL FreeEnvironmentStrings(PTSTR pszEnvironmentBlock); // 不用的時(shí)候調(diào)用此函數(shù)釋放內(nèi)存塊


            4.2.5 pszCurDir

            設(shè)定工作目錄和驅(qū)動(dòng)器號(hào),如果為NULL則和應(yīng)用程序的目錄相同,如果設(shè)置比如以’\0’結(jié)尾的包含驅(qū)動(dòng)器名的路徑。

            4.2.6 psiStartInfo

            typedef struct _STARTUPINFO {
                DWORD   cb;             //(兩者兼有,控制臺(tái)和窗口程序) 
                LPSTR   lpReserved;     // (兩者兼有)保留,必須初始化為NULL
                LPSTR   lpDesktop;      // (兩者兼有)用于標(biāo)識(shí)啟動(dòng)應(yīng)用程序所在的桌面的名字。如果該桌面存在,新進(jìn)程便與指定的桌面相關(guān)聯(lián)。如果桌面不存在,便創(chuàng)建一個(gè)帶有默認(rèn)屬性的桌面,并使用為新進(jìn)程指定的名字。如果lpDesktop是NULL(這是最常見(jiàn)的情況),那么該進(jìn)程將與當(dāng)前桌面相關(guān)聯(lián)。
                LPSTR   lpTitle;        // (控制臺(tái))用于設(shè)定控制臺(tái)窗口名稱。如果lpTitle是NULL,則可執(zhí)行文件的名字將用作窗口名
                DWORD   dwX;            // x,y坐標(biāo),只有當(dāng)子進(jìn)程用CW_USEDEFAULT作為CreateWindows的x參數(shù)來(lái)創(chuàng)建它的第一個(gè)重疊窗口時(shí),才使用這兩個(gè)坐標(biāo)。若是創(chuàng)建控制臺(tái)窗口的應(yīng)用程序,這些成員用于指明控制臺(tái)窗口的左上角。
                DWORD   dwY;          
                DWORD   dwXSize;        //(兩者兼有)設(shè)定窗口寬度和長(zhǎng)度,只有子進(jìn)程用WM_USEDEFAULT作為CreateWIndows的nWidth參數(shù)來(lái)創(chuàng)建它的第一個(gè)重疊窗口時(shí)才是用這個(gè)值。控制臺(tái)就是控制臺(tái)的寬和長(zhǎng)
                DWORD   dwYSize;
                DWORD   dwXCountChars;  //(控制臺(tái))用于設(shè)定子應(yīng)用程序控制臺(tái)的長(zhǎng)度和寬度(字符表示)
                DWORD   dwYCountChars;
                DWORD   dwFillAttribute;// (控制臺(tái))用于設(shè)定子應(yīng)用程序的控制臺(tái)背影顏色和文本。
                DWORD   dwFlags;        // (兩者兼有)參見(jiàn)下一段
                WORD    wShowWindow;    // (窗口)用于設(shè)定子應(yīng)用程序初次調(diào)用ShowWindow將SW_SHOWDEFAULT作為nCmdShow參數(shù)傳遞時(shí),該應(yīng)用程序的第一個(gè)重疊窗口應(yīng)該如何出現(xiàn)。本成員可以是通常用于ShowWindow函數(shù)的任何一個(gè)SW_*標(biāo)識(shí)符
                WORD    cbReserved2;    // 保留,必須初始化為0
                LPBYTE  lpReserved2;    // 保留,必須初始化為NULL
                HANDLE  hStdInput;      // (控制臺(tái))用于設(shè)定控制臺(tái)輸入和輸出用的緩存的句柄。默認(rèn)設(shè)置hStdInput是鍵盤(pán)緩存,hStdOutput和hStdError窗口的緩存。
                HANDLE  hStdOutput;     // 
                HANDLE  hStdError;
            } STARTUPINFO, *LPSTARTUPINFO;


            設(shè)置某些值,大部分需要默認(rèn)值,必須初始化為0都。

            STARTUPINFO si = {sizeof(si)};

            dwFlags標(biāo)志,用于修改如何來(lái)創(chuàng)建子進(jìn)程。


            標(biāo)志
            STARTF_USESIZE                                                                              使用dwXSize和dwYSize成員

            STARTF_USESHOWWINDOW                                                         使用wShowWIndow成員

            STARTF_USEPOSITION                                                                    使用dwX和dwY成員

            STARTF_USECOUNTCHARS                                                            使用dwXCountChars和dwYCountChars成員

            STARTF_USEFILLATTRIBUTE                                                           使用dwFillAttribute成員

            STARTF_USESTDHANDLES                                                             使用hStdInput,hStdOutput和hStdError成員

            STARTF_RUN_FULLSCREEN                                                            強(qiáng)制再x86計(jì)算機(jī)上運(yùn)行的控制臺(tái)應(yīng)用程序以全屏幕方式啟動(dòng)運(yùn)行

            STARTF_FORCEONFEEDBACK                                                        光標(biāo)設(shè)置為沙漏,過(guò)了2秒如果進(jìn)程沒(méi)啟動(dòng)GUI,CreateProcess程序?qū)⒐鈽?biāo)設(shè)置為箭頭,5秒內(nèi)顯示一個(gè)窗口,成功調(diào)用GetMessage則反復(fù)箭頭,如果沒(méi)有成功,等待5秒 變?yōu)榧^

            STARTF_FORCEOFFFEEDBACK                                                                                      


            4.2.7 ppiProcInfo

            typedef struct _PROCESS_INFORMATION {
                HANDLE hProcess;
                HANDLE hThread;
                DWORD dwProcessId;
                DWORD dwThreadId;
            } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

            返回的分別是,子進(jìn)程進(jìn)程句柄,子進(jìn)程中主線程的線程句柄,子進(jìn)程ID,子進(jìn)程中主線程的ID。

            注意:

            1. hProcess和hThread被賦值后,內(nèi)核對(duì)象的計(jì)數(shù)器分別被+1。
            2. 系統(tǒng)為每個(gè)進(jìn)程和線程分配的ID值都是不同的,但是當(dāng)某進(jìn)程退出后,新進(jìn)程很可能會(huì)使用退出進(jìn)程的ID。

             

            4.3 終止進(jìn)程的運(yùn)行

            4.3.1 主線程的進(jìn)入點(diǎn)函數(shù)返回

            最好強(qiáng)力推薦使用這種方式。

            1. 調(diào)用C++析構(gòu)函數(shù)。
            2. 釋放堆棧內(nèi)存。
            3. 將進(jìn)程退出代碼(進(jìn)程內(nèi)核對(duì)象中維護(hù))設(shè)置為進(jìn)入點(diǎn)函數(shù)返回值。
            4. 系統(tǒng)將進(jìn)程內(nèi)核對(duì)象的返回值減去1。

            4.3.2 ExitProcess函數(shù)

            避免使用這個(gè)方法。

            VOID ExitProcess(UINT fuExitCode);

            終止進(jìn)程運(yùn)行,并將退出碼設(shè)置為fuExitCode。

            注意:

            1. 調(diào)用ExitProcess后,所有的代碼都將不會(huì)執(zhí)行,關(guān)閉進(jìn)程。
            2. 調(diào)用ExitProcess后,不會(huì)釋放C++析構(gòu)函數(shù)資源,有系統(tǒng)清理進(jìn)程時(shí)候直接釋放內(nèi)存。
            3. 進(jìn)程的主線程直接return退出后,啟動(dòng)函數(shù)中也會(huì)調(diào)用ExitProcess函數(shù),進(jìn)程終止,其他線程也會(huì)關(guān)閉。
            4. 進(jìn)程的主線程調(diào)用_endThreadex或者EndThread函數(shù)關(guān)閉主線程后,進(jìn)程沒(méi)有被關(guān)閉,子線程繼續(xù)運(yùn)行。

             

            4.3.3 TerminiateProcess函數(shù)

            能不用就別用。

            BOOL TerminiateProcess(HANDLE hProcess, UINT fuExitCode;)

            關(guān)閉指定為hProcess句柄的進(jìn)程,推出代碼為fuExitCode。

            注意:

            1. 關(guān)閉進(jìn)程將丟失所有需要保存到硬盤(pán)的數(shù)據(jù),因?yàn)檫M(jìn)程關(guān)閉時(shí)候最后會(huì)自己釋放內(nèi)存資源,關(guān)閉內(nèi)核對(duì)象的句柄值,所以不會(huì)造成內(nèi)存泄露。
            2. 此函數(shù)是個(gè)異步函數(shù),它返回的時(shí)候無(wú)法知道,需要關(guān)閉的進(jìn)程是否已經(jīng)被強(qiáng)制關(guān)閉了。

            4.3.4 進(jìn)程終止運(yùn)行時(shí)出現(xiàn)的情況

            1. 進(jìn)程中剩余的所有線程全部終止運(yùn)行。
            2. 釋放該進(jìn)程引用的GDI和用戶對(duì)象,內(nèi)核對(duì)象被關(guān)閉(別的進(jìn)程有引用則計(jì)數(shù)器減1,如果沒(méi)有引用則關(guān)閉內(nèi)核對(duì)象)。
            3. 推出代碼將從STILL_ACTIVE(后面章節(jié)線程將介紹該結(jié)構(gòu))改為傳遞給ExitProcess和TerminiateProcess代碼。
            4. 內(nèi)核對(duì)象狀態(tài)變?yōu)槭盏酵ㄖ獱顟B(tài)(線程中介紹),其他線程掛起,知道進(jìn)程終止。
            5. 進(jìn)程內(nèi)核對(duì)象計(jì)數(shù)減去1,或者關(guān)閉。

            注意:

            進(jìn)程內(nèi)核對(duì)象的壽命可能遠(yuǎn)遠(yuǎn)大于進(jìn)程本身,父進(jìn)程保留子進(jìn)程內(nèi)核對(duì)象可以查看它的推出代碼調(diào)用下面函數(shù):

            BOOL GetExitCodeProcess(HANDLE hProcess, PDWORD pdwExitCode);


            可以調(diào)用這個(gè)函數(shù)來(lái)判斷子進(jìn)程是否關(guān)閉,如果子進(jìn)程沒(méi)有關(guān)閉,它的STILL_ACTIVE標(biāo)識(shí)符定義為0x103。但是這么作效率不是很高。

             

            4.4 子進(jìn)程

            沒(méi)什么好說(shuō)的,前面的都說(shuō)了,用CloseHandle關(guān)閉子進(jìn)程和子進(jìn)程中主線程的句柄值來(lái)切斷父進(jìn)程和子進(jìn)程的所有聯(lián)系。

             

            4.5 每局系統(tǒng)中運(yùn)行的進(jìn)程

            利用ToolHelp函數(shù)族來(lái)開(kāi)發(fā)管理操作系統(tǒng)上的進(jìn)程。打算自己也寫(xiě)個(gè)試試。

             

            本文章的內(nèi)容是本人學(xué)習(xí)Windows核心編程第四章后的總結(jié),有錯(cuò)誤請(qǐng)大家糾正,轉(zhuǎn)載注明出處:

            http://www.cnblogs.com/xi52qian/

            posted on 2011-03-07 09:40 xi52qian 閱讀(385) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


             
            Copyright © xi52qian Powered by: 博客園 模板提供:滬江博客
            天堂无码久久综合东京热| 久久棈精品久久久久久噜噜| 国产精品久久久久久久| 久久精品国产99国产精偷| 久久精品这里只有精99品| 久久人人爽人人爽人人爽| 久久精品成人免费看| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久精品人妻中文系列| .精品久久久麻豆国产精品| 久久国产精品无码网站| 久久亚洲日韩精品一区二区三区| 一本久久久久久久| 亚洲精品乱码久久久久久按摩| 久久精品国产亚洲沈樵| 亚洲人成精品久久久久| 久久国产精品免费| 久久精品国产91久久综合麻豆自制| 久久天天躁狠狠躁夜夜不卡| 国内精品久久久久久不卡影院| 久久久无码人妻精品无码| 欧美与黑人午夜性猛交久久久| 久久精品国产69国产精品亚洲| 伊人久久综合无码成人网| 国产精品成人久久久久久久| 国产精品久久免费| 久久综合狠狠综合久久综合88| 亚洲国产成人精品无码久久久久久综合 | 伊人久久大香线蕉精品不卡 | 久久精品无码专区免费东京热 | 嫩草伊人久久精品少妇AV| 18禁黄久久久AAA片| 热综合一本伊人久久精品 | 久久精品视频一| 亚洲国产精品无码久久青草| 久久久久这里只有精品| 久久影院久久香蕉国产线看观看| 99久久国产综合精品网成人影院| 四虎国产精品免费久久5151| 久久亚洲精品中文字幕三区| 99久久国产综合精品五月天喷水 |