免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

WIN32API函數(shù)CreateProcess

 大機(jī)器人 2013-05-27
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;
  }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多