WIN32API函數(shù)CreateProcess用來創(chuàng)建一個(gè)新的進(jìn)程和它的主線程,這個(gè)新進(jìn)程運(yùn)行指定的可執(zhí)行文件。 (一)函數(shù)原型: BOOL CreateProcess ( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes。 LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); (二)參數(shù): 1.lpApplicationName: 指向一個(gè)NULL結(jié)尾的、用來指定可執(zhí)行模塊的字符串。 這個(gè)字符串可以使可執(zhí)行模塊的絕對(duì)路徑,也可以是相對(duì)路徑,在后一種情況下,函數(shù)使用當(dāng)前驅(qū)動(dòng)器和目錄建立可執(zhí)行模塊的路徑。 這個(gè)參數(shù)可以被設(shè)為NULL,在這種情況下,可執(zhí)行模塊的名字必須處于 lpCommandLine 參數(shù)的最前面并由空格符與后面的字符分開。 這個(gè)被指定的模塊可以是一個(gè)Win32應(yīng)用程序。如果適當(dāng)?shù)淖酉到y(tǒng)在當(dāng)前計(jì)算機(jī)上可用的話,它也可以是其他類型的模塊(如MS-DOS 或 OS/2)。 在Windows NT中,如果可執(zhí)行模塊是一個(gè)16位的應(yīng)用程序,那么這個(gè)參數(shù)應(yīng)該被設(shè)置為NULL并且因該在lpCommandLine參數(shù)中指定可執(zhí)行模塊的名稱。16位的應(yīng)用程序是以DOS虛擬機(jī)或Win32上的Windows(WOW) 為進(jìn)程的方式運(yùn)行。 2.lpCommandLine: 指向一個(gè)NULL結(jié)尾的、用來指定要運(yùn)行的命令行。 這個(gè)參數(shù)可以為空,那么函數(shù)將使用參數(shù)指定的字符串當(dāng)作要運(yùn)行的程序的命令行。 如果lpApplicationName和lpCommandLine參數(shù)都不為空,那么lpApplicationName參數(shù)指定將要被運(yùn)行的模塊,lpCommandLine參數(shù)指定將被運(yùn)行的模塊的命令行。新運(yùn)行的進(jìn)程可以使用GetCommandLine函數(shù)獲得整個(gè)命令行。C語言程序可以使用argc和argv參數(shù)。 如果lpApplicationName參數(shù)為空,那么這個(gè)字符串中的第一個(gè)被空格分隔的要素指定可執(zhí)行模塊名。如果文件名不包含擴(kuò)展名,那么.exe將被假定為默認(rèn)的擴(kuò)展名。如果文件名以一個(gè)點(diǎn)(.)結(jié)尾且沒有擴(kuò)展名,或文件名中包含路徑,.exe將不會(huì)被加到后面。如果文件名中不包含路徑,Windows將按照如下順序?qū)ふ疫@個(gè)可執(zhí)行文件: 1).當(dāng)前應(yīng)用程序的目錄。 2).父進(jìn)程的目錄。 3).Windows 95:Windows系統(tǒng)目錄,可以使用GetSystemDirectory函數(shù)獲得。 Windows NT:32位Windows系統(tǒng)目錄??梢允褂肎etSystemDirectory函數(shù)獲得,目錄名是SYSTEM32。 4).在Windows NT中:16位Windows系統(tǒng)目錄。不可以使用Win32函數(shù)獲得這個(gè)目錄,但是它會(huì)被搜索,目錄名是SYSTEM。 5).Windows目錄??梢允褂肎etWindowsDirectory函數(shù)獲得這個(gè)目錄。 6).列在PATH環(huán)境變量中的目錄。 如果被創(chuàng)建的進(jìn)程是一個(gè)以MS-DOS或16位Windows為基礎(chǔ)的應(yīng)用程序,lpCommandLine參數(shù)應(yīng)該是一個(gè)以可執(zhí)行文件的文件名作為第一個(gè)要素的絕對(duì)路徑,因?yàn)檫@樣做可以使32位Windows程序工作的很好,這樣設(shè)置lpCommandLine參數(shù)是最強(qiáng)壯的。 3.lpProcessAttributes: 指向一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體決定是否返回的句柄可以被子進(jìn)程繼承。如果lpProcessAttributes參數(shù)為空(NULL),那么句柄不能被繼承。 在Windows NT中:SECURITY_ATTRIBUTES結(jié)構(gòu)的lpSecurityDescriptor成員指定了新進(jìn)程的安全描述符,如果參數(shù)為空,新進(jìn)程使用默認(rèn)的安全描述符。 在Windows95中:SECURITY_ATTRIBUTES結(jié)構(gòu)的lpSecurityDescriptor成員被忽略。 4.lpThreadAttributes: 指向一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體決定是否返回的句柄可以被子進(jìn)程繼承。如果lpThreadAttributes參數(shù)為空(NULL),那么句柄不能被繼承。 在Windows NT中,SECURITY_ATTRIBUTES結(jié)構(gòu)的lpSecurityDescriptor成員指定了主線程的安全描述符,如果參數(shù)為空,主線程使用默認(rèn)的安全描述符。 在Windows95中:SECURITY_ATTRIBUTES結(jié)構(gòu)的lpSecurityDescriptor成員被忽略。 5.bInheritHandles: 指示新進(jìn)程是否從調(diào)用進(jìn)程處繼承了句柄。 如果參數(shù)的值為真,調(diào)用進(jìn)程中的每一個(gè)可繼承的打開句柄都將被子進(jìn)程繼承。被繼承的句柄與原進(jìn)程擁有完全相同的值和訪問權(quán)限。 5.dwCreationFlags: 指定附加的、用來控制優(yōu)先類和進(jìn)程的創(chuàng)建的標(biāo)志。以下的創(chuàng)建標(biāo)志可以以除下面列出的方式外的任何方式組合后指定。 (1)值:CREATE_DEFAULT_ERROR_MODE 含義:新的進(jìn)程不繼承調(diào)用進(jìn)程的錯(cuò)誤模式。CreateProcess函數(shù)賦予新進(jìn)程當(dāng)前的默認(rèn)錯(cuò)誤模式作為替代。應(yīng)用程序可以調(diào)用SetErrorMode函數(shù)設(shè)置當(dāng)前的默認(rèn)錯(cuò)誤模式。 這個(gè)標(biāo)志對(duì)于那些運(yùn)行在沒有硬件錯(cuò)誤環(huán)境下的多線程外殼程序是十分有用的。 對(duì)于CreateProcess函數(shù),默認(rèn)的行為是為新進(jìn)程繼承調(diào)用者的錯(cuò)誤模式。設(shè)置這個(gè)標(biāo)志以改變默認(rèn)的處理方式。 (2)值:CREATE_NEW_CONSOLE 含義:新的進(jìn)程將使用一個(gè)新的控制臺(tái),而不是繼承父進(jìn)程的控制臺(tái)。這個(gè)標(biāo)志不能與DETACHED_PROCESS標(biāo)志一起使用。 (3)值:CREATE_NEW_PROCESS_GROUP 含義:新進(jìn)程將使一個(gè)進(jìn)程樹的根進(jìn)程。進(jìn)程樹種的全部進(jìn)程都是根進(jìn)程的子進(jìn)程。新進(jìn)程樹的用戶標(biāo)識(shí)符與這個(gè)進(jìn)程的標(biāo)識(shí)符是相同的,由lpProcessInformation參數(shù)返回。進(jìn)程樹經(jīng)常使用 GenerateConsoleCtrlEvent函數(shù)允許發(fā)送CTRL+C或CTRL+BREAK信號(hào)到一組控制臺(tái)進(jìn)程。 (4)值:CREATE_SEPARATE_WOW_VDM 含義:(只適用于Windows NT)這個(gè)標(biāo)志只有當(dāng)運(yùn)行一個(gè)16位的 Windows應(yīng)用程序時(shí)才是有效的。如果被設(shè)置,新進(jìn)程將會(huì)在一個(gè)私有的虛擬DOS機(jī)(VDM)中運(yùn)行。另外,默認(rèn)情況下所有的16位Windows應(yīng)用程序都會(huì)在同一個(gè)共享的VDM中以線程的方式運(yùn)行。單獨(dú)運(yùn)行一個(gè)16位程序的優(yōu)點(diǎn)是一個(gè)應(yīng)用程序的崩潰只會(huì)結(jié)束這一個(gè)VDM的運(yùn)行;其他那些在不同 VDM中運(yùn)行的程序會(huì)繼續(xù)正常的運(yùn)行。同樣的,在不同VDM中運(yùn)行的16位Windows應(yīng)用程序擁有不同的輸入隊(duì)列,這意味著如果一個(gè)程序暫時(shí)失去響應(yīng),在獨(dú)立的VDM中的應(yīng)用程序能夠繼續(xù)獲得輸入。 (5)值:CREATE_SHARED_WOW_VDM 含義:(只適用于Windows NT)這個(gè)標(biāo)志只有當(dāng)運(yùn)行一個(gè)16位的Windows應(yīng)用程序時(shí)才是有效的。如果WIN.INI中的Windows段的DefaultSeparateVDM選項(xiàng)被設(shè)置為真,這個(gè)標(biāo)識(shí)使得CreateProcess函數(shù)越過這個(gè)選項(xiàng)并在共享的虛擬DOS機(jī)中運(yùn)行新進(jìn)程。 (6)值:CREATE_SUSPENDED 含義:新進(jìn)程的主線程會(huì)以暫停的狀態(tài)被創(chuàng)建,直到調(diào)用ResumeThread函數(shù)被調(diào)用時(shí)才運(yùn)行。 (7)值:CREATE_UNICODE_ENVIRONMENT 含義:如果被設(shè)置,由lpEnvironment參數(shù)指定的環(huán)境塊使用Unicode字符,如果為空,環(huán)境塊使用ANSI字符。 (8)值:DEBUG_PROCESS 含義:如果這個(gè)標(biāo)志被設(shè)置,調(diào)用進(jìn)程將被當(dāng)作一個(gè)調(diào)試程序,并且新進(jìn)程會(huì)被當(dāng)作被調(diào)試的進(jìn)程。系統(tǒng)把被調(diào)試程序發(fā)生的所有調(diào)試事件通知給調(diào)試器。 如果你使用這個(gè)標(biāo)志創(chuàng)建進(jìn)程,只有調(diào)用進(jìn)程(調(diào)用CreateProcess函數(shù)的進(jìn)程)可以調(diào)用WaitForDebugEvent函數(shù)。 (9)值:DEBUG_ONLY_THIS_PROCESS 含義:如果此標(biāo)志沒有被設(shè)置且調(diào)用進(jìn)程正在被調(diào)試,新進(jìn)程將成為調(diào)試調(diào)用進(jìn)程的調(diào)試器的另一個(gè)調(diào)試對(duì)象。如果調(diào)用進(jìn)程沒有被調(diào)試,有關(guān)調(diào)試的行為就不會(huì)產(chǎn)生。 (10)值:DETACHED_PROCESS 含義:對(duì)于控制臺(tái)進(jìn)程,新進(jìn)程沒有訪問父進(jìn)程控制臺(tái)的權(quán)限。新進(jìn)程可以通過AllocConsole函數(shù)自己創(chuàng)建一個(gè)新的控制臺(tái)。這個(gè)標(biāo)志不可以與CREATE_NEW_CONSOLE標(biāo)志一起使用。 6.dwCreationFlags參數(shù) 還用來控制新進(jìn)程的優(yōu)先類,優(yōu)先類用來決定此進(jìn)程的線程調(diào)度的優(yōu)先級(jí)。如果下面的優(yōu)先級(jí)類標(biāo)志都沒有被指定,那么默認(rèn)的優(yōu)先類是NORMAL_PRIORITY_CLASS,除非被創(chuàng)建的進(jìn)程是IDLE_PRIORITY_CLASS。在這種情況下子進(jìn)程的默認(rèn)優(yōu)先類是IDLE_PRIORITY_CLASS。 可以下面的標(biāo)志中的一個(gè): 優(yōu)先級(jí):HIGH_PRIORITY_CLASS 含義:指示這個(gè)進(jìn)程將執(zhí)行時(shí)間臨界的任務(wù),所以它必須被立即運(yùn)行以保證正確。這個(gè)優(yōu)先級(jí)的程序優(yōu)先于正常優(yōu)先級(jí)或空閑優(yōu)先級(jí)的程序。一個(gè)例子是Windows任務(wù)列表,為了保證當(dāng)用戶調(diào)用時(shí)可以立刻響應(yīng),放棄了對(duì)系統(tǒng)負(fù)荷的考慮。確保在使用高優(yōu)先級(jí)時(shí)應(yīng)該足夠謹(jǐn)慎,因?yàn)橐粋€(gè)高優(yōu)先級(jí)的CPU關(guān)聯(lián)應(yīng)用程序可以占用幾乎全部的CPU可用時(shí)間。 優(yōu)先級(jí):IDLE_PRIORITY_CLASS 含義:指示這個(gè)進(jìn)程的線程只有在系統(tǒng)空閑時(shí)才會(huì)運(yùn)行并且可以被任何高優(yōu)先級(jí)的任務(wù)打斷。例如屏幕保護(hù)程序??臻e優(yōu)先級(jí)會(huì)被子進(jìn)程繼承。 優(yōu)先級(jí):NORMAL_PRIORITY_CLASS 含義:指示這個(gè)進(jìn)程沒有特殊的任務(wù)調(diào)度要求。 優(yōu)先級(jí):REALTIME_PRIORITY_CLASS 含義:指示這個(gè)進(jìn)程擁有可用的最高優(yōu)先級(jí)。一個(gè)擁有實(shí)時(shí)優(yōu)先級(jí)的進(jìn)程的線程可以打斷所有其他進(jìn)程線程的執(zhí)行,包括正在執(zhí)行重要任務(wù)的系統(tǒng)進(jìn)程。例如,一個(gè)執(zhí)行時(shí)間稍長一點(diǎn)的實(shí)時(shí)進(jìn)程可能導(dǎo)致磁盤緩存不足或鼠標(biāo)反映遲鈍。 7.lpEnvironment: 指向一個(gè)新進(jìn)程的環(huán)境塊。如果此參數(shù)為空,新進(jìn)程使用調(diào)用進(jìn)程的環(huán)境。 一個(gè)環(huán)境塊存在于一個(gè)由以NULL結(jié)尾的字符串組成的塊中,這個(gè)塊也是以NULL結(jié)尾的。每個(gè)字符串都是name=value的形式。 因?yàn)橄嗟葮?biāo)志被當(dāng)作分隔符,所以它不能被環(huán)境變量當(dāng)作變量名。 與其使用應(yīng)用程序提供的環(huán)境塊,不如直接把這個(gè)參數(shù)設(shè)為空,系統(tǒng)驅(qū)動(dòng)器上的當(dāng)前目錄信息不會(huì)被自動(dòng)傳遞給新創(chuàng)建的進(jìn)程。對(duì)于這個(gè)情況的探討和如何處理,請(qǐng)參見注釋一節(jié)。 環(huán)境塊可以包含Unicode或ANSI字符。如果lpEnvironment指向的環(huán)境塊包含Unicode字符,那么dwCreationFlags字段的CREATE_UNICODE_ENVIRONMENT標(biāo)志將被設(shè)置。如果塊包含 ANSI字符,該標(biāo)志將被清空。 請(qǐng)注意一個(gè)ANSI環(huán)境塊是由兩個(gè)零字節(jié)結(jié)束的:一個(gè)是字符串的結(jié)尾,另一個(gè)用來結(jié)束這個(gè)快。一個(gè)Unicode環(huán)境塊石油四個(gè)零字節(jié)結(jié)束的:兩個(gè)代表字符串結(jié)束,另兩個(gè)用來結(jié)束塊。 8.lpCurrentDirectory: 指向一個(gè)以NULL結(jié)尾的字符串,這個(gè)字符串用來指定子進(jìn)程的工作路徑。這個(gè)字符串必須是一個(gè)包含驅(qū)動(dòng)器名的絕對(duì)路徑。如果這個(gè)參數(shù)為空,新進(jìn)程將使用與調(diào)用進(jìn)程相同的驅(qū)動(dòng)器和目錄。這個(gè)選項(xiàng)是一個(gè)需要啟動(dòng)啟動(dòng)應(yīng)用程序并指定它們的驅(qū)動(dòng)器和工作目錄的外殼程序的主要條件。 9.lpStartupInfo: 指向一個(gè)用于決定新進(jìn)程的主窗體如何顯示的STARTUPINFO結(jié)構(gòu)體。 10.lpProcessInformation: 指向一個(gè)用來接收新進(jìn)程的識(shí)別信息的PROCESS_INFORMATION結(jié)構(gòu)體。 (三) 返回值: 如果函數(shù)執(zhí)行成功,返回非零值。 如果函數(shù)執(zhí)行失敗,返回零,可以使用GetLastError函數(shù)獲得錯(cuò)誤的附加信息。 注釋: CreateProcess函數(shù)用來運(yùn)行一個(gè)新程序。WinExec和LoadModule函數(shù)依舊可用,但是它們同樣通過調(diào)用CreateProcess函數(shù)實(shí)現(xiàn)。 另外CreateProcess函數(shù)除了創(chuàng)建一個(gè)進(jìn)程,還創(chuàng)建一個(gè)線程對(duì)象。這個(gè)線程將連同一個(gè)已初始化了的堆棧一起被創(chuàng)建,堆棧的大小由可執(zhí)行文件的文件頭中的描述決定。線程由文件頭處開始執(zhí)行。 新進(jìn)程和新線程的句柄被以全局訪問權(quán)限創(chuàng)建。對(duì)于這兩個(gè)句柄中的任一個(gè),如果沒有安全描述符,那么這個(gè)句柄就可以在任何需要句柄類型作為參數(shù)的函數(shù)中被使用。當(dāng)提供安全描述符時(shí),在接下來的時(shí)候當(dāng)句柄被使用時(shí),總是會(huì)先進(jìn)行訪問權(quán)限的檢查,如果訪問權(quán)限檢查拒絕訪問,請(qǐng)求的進(jìn)程將不能使用這個(gè)句柄訪問這個(gè)進(jìn)程。 這個(gè)進(jìn)程會(huì)被分配給一個(gè)32位的進(jìn)程標(biāo)識(shí)符。直到進(jìn)程中止這個(gè)標(biāo)識(shí)符都是有效的。它可以被用來標(biāo)識(shí)這個(gè)進(jìn)程,或在OpenProcess函數(shù)中被指定以打開這個(gè)進(jìn)程的句柄。進(jìn)程中被初始化了的線程一樣會(huì)被分配一個(gè)32位的線程標(biāo)識(shí)符。這個(gè)標(biāo)識(shí)符直到縣城中止都是有效的且可以用來在系統(tǒng)中唯一標(biāo)識(shí)這個(gè)線程。這些標(biāo)識(shí)符在PROCESS_INFORMATION結(jié)構(gòu)體中返回。 當(dāng)在lpApplicationName或lpCommandLine參數(shù)中指定應(yīng)用程序名時(shí),應(yīng)用程序名中是否包含擴(kuò)展名都不會(huì)影響運(yùn)行,只有一種情況例外:一個(gè)以.com為擴(kuò)展名的MS-DOS程序或Windows程序必須包含.com擴(kuò)展名。 調(diào)用進(jìn)程可以通過WaitForInputIdle函數(shù)來等待新進(jìn)程完成它的初始化并等待用戶輸入。這對(duì)于父進(jìn)程和子進(jìn)程之間的同步是極其有用的,因?yàn)镃reateProcess函數(shù)不會(huì)等待新進(jìn)程完成它的初始化工作。舉例來說,在試圖與新進(jìn)程關(guān)聯(lián)的窗口之前,進(jìn)程應(yīng)該先調(diào)用WaitForInputIdle。 首選的結(jié)束一個(gè)進(jìn)程的方式是調(diào)用ExitProcess函數(shù),因?yàn)檫@個(gè)函數(shù)通知這個(gè)進(jìn)程的所有動(dòng)態(tài)鏈接庫(DLLs)程序已進(jìn)入結(jié)束狀態(tài)。其他的結(jié)束進(jìn)程的方法不會(huì)通知關(guān)聯(lián)的動(dòng)態(tài)鏈接庫。注意當(dāng)一個(gè)進(jìn)程調(diào)用ExitProcess時(shí),這個(gè)進(jìn)程的其他縣城沒有機(jī)會(huì)運(yùn)行其他任何代碼(包括關(guān)聯(lián)動(dòng)態(tài)鏈接庫的終止代碼)。 ExitProcess, ExitThread, CreateThread, CreateRemoteThread,當(dāng)一個(gè)進(jìn)程啟動(dòng)時(shí)(調(diào)用了CreateProcess的結(jié)果)是在進(jìn)程中序列化進(jìn)行的。在一段地址空間中,同一時(shí)間內(nèi)這些事件中只有一個(gè)可以發(fā)生。這意味著下面的限制將保留: *在進(jìn)程啟動(dòng)和DLL初始化階段,新的線程可以被創(chuàng)建,但是直到進(jìn)程的DLL初始化完成前它們都不能開始運(yùn)行。 *在DLL初始化或卸下例程中進(jìn)程中只能有一個(gè)線程。 *直到所有的線程都完成DLL初始化或卸下后,ExitProcess函數(shù)才返回。 在進(jìn)程中的所有線程都終止且進(jìn)程所有的句柄和它們的線程被通過調(diào)用CloseHandle函數(shù)終止前,進(jìn)程會(huì)留在系統(tǒng)中。進(jìn)程和主線程的句柄都必須通過調(diào)用CloseHandle函數(shù)關(guān)閉。如果不再需要這些句柄,最好在創(chuàng)建進(jìn)程后立刻關(guān)閉它們。 當(dāng)進(jìn)程中最后一個(gè)線程終止時(shí),下列的事件發(fā)生: *所有由進(jìn)程打開的對(duì)象都會(huì)關(guān)閉。 *進(jìn)程的終止?fàn)顟B(tài)(由GetExitCodeProcess函數(shù)返回)從它的初始值STILL_ACTIVE變?yōu)樽詈笠粋€(gè)結(jié)束的線程的結(jié)束狀態(tài)。 *主線程的線程對(duì)象被設(shè)置為標(biāo)志狀態(tài),供其他等待這個(gè)對(duì)象的線程使用。 *進(jìn)程對(duì)象被設(shè)置為標(biāo)志狀態(tài),供其他等待這個(gè)對(duì)象的線程使用。 假設(shè)當(dāng)前在C盤上的目錄是\MSVC\MFC且有一個(gè)環(huán)境變量叫做C:,它的值是C:\MSVC\MFC,就像前面lpEnvironment中提到過的那樣,這樣的系統(tǒng)驅(qū)動(dòng)器上的目錄信息在CreateProcess函數(shù)的lpEnvironment參數(shù)不為空時(shí)不會(huì)被自動(dòng)傳遞到新進(jìn)程里。一個(gè)應(yīng)用程序必須手動(dòng)地把當(dāng)前目錄信息傳遞到新的進(jìn)程中。為了這樣做,應(yīng)用程序必須直接創(chuàng)建環(huán)境字符串,并把它們按字母順序排列(因?yàn)閃indows NT和Windows 95使用一種簡略的環(huán)境變量),并把它們放進(jìn)lpEnvironment中指定的環(huán)境塊中。類似的,他們要找到環(huán)境塊的開頭,又要重復(fù)一次前面提到的環(huán)境塊的排序。 一種獲得驅(qū)動(dòng)器X的當(dāng)前目錄變量的方法是調(diào)用GetFullPathName("x:",..)。這避免了一個(gè)應(yīng)用程序必須去掃描環(huán)境塊。如果返回的絕對(duì)路徑是X:\,就不需要把這個(gè)值當(dāng)作一個(gè)環(huán)境數(shù)據(jù)去傳遞了,因?yàn)楦夸浭球?qū)動(dòng)器X上的新進(jìn)程的默認(rèn)當(dāng)前目錄。 由CreateProcess函數(shù)返回的句柄對(duì)于進(jìn)程對(duì)象具有PROCESS_ALL_ACCESS的訪問權(quán)限。 由lpcurrentDirectory參數(shù)指定的當(dāng)前目錄室子進(jìn)程對(duì)象的當(dāng)前目錄。lpCommandLine參數(shù)指定的第二個(gè)項(xiàng)目是父進(jìn)程的當(dāng)前目錄。 對(duì)于Windows NT,當(dāng)一個(gè)進(jìn)程在指定了CREATE_NEW_PROCESS_GROUP的情況下被創(chuàng)建時(shí),一個(gè)對(duì)于SetConsoleCtrlHandler(NULL,True)的調(diào)用被用在新的進(jìn)程上,這意味著對(duì)新進(jìn)程來說CTRL+C是無效的。這使得上層的外科程序可以自己處理CTRL+C信息并有選擇的把這些信號(hào)傳遞給子進(jìn)程。CTRL+BREAK依舊有效,并可被用來中斷進(jìn)程/進(jìn)程樹的執(zhí)行。 安全注釋: 第一個(gè)參數(shù)lpApplicationName可能是空,這種情況下,可執(zhí)行文件的名字必須在 lpCommandLine中,lpCommandLine參數(shù)中可以包含空格。如果可執(zhí)行文件或路徑中包含空格,那么就會(huì)有執(zhí)行不正確文件的風(fēng)險(xiǎn),這是由于這個(gè)函數(shù)解析空格的方法引起的。例如:下邊這個(gè)例子就很危險(xiǎn),因?yàn)樗噲D運(yùn)行Program.exe文件,如果這個(gè)文件存在,它就會(huì)代替 MyApp.exe文件的運(yùn)行。 CreateProcess(NULL,”C:\\Program Files\\MyApp.exe”,…….) 如果有惡意的用戶在系統(tǒng)編寫了一個(gè)名為Program.exe的文件,那么任何調(diào)用CreateProcess函數(shù),且在文件路徑中使用Program Files文件夾的參數(shù),都有可能會(huì)運(yùn)行Program.exe文件,而不是運(yùn)行本來打算運(yùn)行的文件。 要避免這個(gè)問題,可以不要將NULL值傳遞給lpApplicationName參數(shù),或者在lpCommandLine中使用雙引號(hào)(轉(zhuǎn)義符)括起可執(zhí)行文件的全路徑名,如下所示: CreateProcess(NULL,”\”C:\\Program Files\\MyApp.exe\” -L -S”,…….) -L和-S是MyApp.exe可執(zhí)行文件的參數(shù)。 最后要說明的一點(diǎn)是:在lpApplicationName中的參數(shù)和lpCommandLine中的第一個(gè)參數(shù)是一樣的,有人說顯得有些重復(fù),其實(shí)這樣做純粹是一種被公認(rèn)化了習(xí)慣! 參見 AllocConsole, CloseHandle, CreateRemoteThread, CreateThread, ExitProcess, ExitThread, GenerateConsoleCtrlEvent, GetCommandLine, GetEnvironmentStrings, GetExitCodeProcess, GetFullPathName, GetStartupInfo, GetSystemDirectory, GetWindowsDirectory, LoadModule, OpenProcess, PROCESS_INFORMATION, ResumeThread, SECURITY_ATTRIBUTES, SetConsoleCtrlHandler, SetErrorMode, STARTUPINFO, TerminateProcess, WaitForInputIdle, WaitForDebugEvent, WinExec 快捷信息: 導(dǎo)入庫:kernel32.lib 頭文件:Winbase.h (四)簡單例子: #include <iostream> #include<windows.h> using namespace std; int main() { STARTUPINFO si; //一些必備參數(shù)設(shè)置 memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; PROCESS_INFORMATION pi; //必備參數(shù)設(shè)置結(jié)束 if(!CreateProcess(NULL,"d:\\test\\te.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) //"d:\\test\\te.exe"是您要運(yùn)行的程序//的路徑 { cout<<"Create Fail!"<<endl; exit(1); } else { cout<<"Sucess!"<<endl; } return 0; } |
|