1. 程式人生 > >Win32 API程式設計----CreateProcess 建立一個新的程序

Win32 API程式設計----CreateProcess 建立一個新的程序

環境 :win10 +vs 2013

1、新建控制檯應用程式,修改名稱CreateProcess

2、選擇空專案後點擊完成。

3、右擊原始檔—新增—新建專案—新建CreateProcess.cpp檔案。


4、CreateProcess 函式原型:

BOOL CreateProcess(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID
lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,);

引數解析:

lpApplicationName:指向NULL結尾的用來指定可執行模組的字串。這個字串可以是可執行模組的絕對路徑,也可
                                   以是相對路徑,在後一種情況下,函式使用當前驅動器和目錄建立可執行模組的路徑。這個引數可以被設
                                  為NULL,在這種情況下,可執行模組的名字必須處於 lpCommandLine 引數最前面並由空格符
與後面的
                                  字元分開。其實就是要執行的應用程式路徑,如:C:\\Windows\\notepad.exe    記事本程式路徑。
lpCommandLine:   指向一個以NULL結尾的字串,該字串指定要執行的命令列。這個引數可以為空,那麼函式將使用     
                                  lpApplicationName
引數指定的字串當做要執行的程式的命令列。如果lpApplicationName和
                                lpCommandLine引數都不為空,那麼lpApplicationName引數指定將要被執行的模組,lpCommandLine
                                  引數指定將被執行的模組的命令列。新執行的程序可以使用
GetCommandLine
函式獲得整個命令列。

lpProcessAttributes:指向一個SECURITY_ATTRIBUTES結構體,這個結構體決定是否返回的控制代碼可以被子程序繼承。如果
                                    lpProcessAttributes引數為空(NULL),那麼控制代碼不能被繼承。                         在Windows NT中SECURITY_ATTRIBUTES結構的lpSecurityDescriptor成員指定了新程序的安全描述符
                         如果引數為空,新程序使用預設的安全描述符。lpThreadAttributes:同lpProcessAttribute,不過這個引數決定的是執行緒是否被繼承.通常置為NULL.
bInheritHandles
:     指示新程序是否從呼叫程序處繼承了控制代碼。如果引數的值為真,呼叫程序中的每一個可繼承的開啟控制代碼
                                    都將被子程序繼承。被繼承的控制代碼與原程序擁有完全相同的值和訪問許可權。dwCreationFlags :   指定附加的、用來控制優先類和程序的建立的標誌。以下的建立標誌可以以除下面列出的方式外的任何
                                   方式組合後指定。  ⑴值:CREATE_DEFAULT_ERROR_MODE 含義:新的程序不繼承呼叫程序的錯誤模式。CreateProcess函式賦予新程序當前的預設錯誤模式作為替代。應用程式可以呼叫SetErrorMode函式設定當前的預設錯誤模式。這個標誌對於那些執行在沒有硬體錯誤環境下的多執行緒外殼程式是十分有用的。對於CreateProcess函式,預設的行為是為新程序繼承呼叫者的錯誤模式。設定這個標誌以改變預設的處理方式。⑵值:CREATE_NEW_CONSOLE含義:新的程序將使用一個新的控制檯,而不是繼承父程序的控制檯。這個標誌不能與DETACHED_PROCESS標誌一起使用。⑶值:CREATE_NEW_PROCESS_GROUP含義:新程序將是一個程序樹的根程序。程序樹中的全部程序都是根程序的子程序。新程序樹的使用者識別符號與這個程序的識別符號是相同的,由lpProcessInformation引數返回。程序樹經常使用GenerateConsoleCtrlEvent函式允許傳送CTRL+C或CTRL+BREAK訊號到一組控制檯程序。⑷值:CREATE_SEPARATE_WOW_VDM如果被設定,新程序將會在一個私有的虛擬DOS機(VDM)中執行。另外,預設情況下所有的16位Windows應用程式都會在同一個共享的VDM中以執行緒的方式執行。單獨執行一個16位程式的優點是一個應用程式的崩潰只會結束這一個VDM的執行;其他那些在不同VDM中執行的程式會繼續正常的執行。同樣的,在不同VDM中執行的16位Windows應用程式擁有不同的輸入佇列,這意味著如果一個程式暫時失去響應,在獨立的VDM中的應用程式能夠繼續獲得輸入。⑸值:CREATE_SHARED_WOW_VDM如果WIN.INI中的Windows段的DefaultSeparateVDM選項被設定為真,這個標識使得CreateProcess函式越過這個選項並在共享的虛擬DOS機中執行新程序。⑹值:CREATE_SUSPENDED含義:新程序的主執行緒會以暫停的狀態被建立,直到呼叫ResumeThread函式被呼叫時才執行。⑺值:CREATE_UNICODE_ENVIRONMENT含義:如果被設定,由lpEnvironment引數指定的環境塊使用Unicode字元,如果為空,環境塊使用ANSI字元。⑻值:DEBUG_PROCESS含義:如果這個標誌被設定,呼叫程序將被當做一個除錯程式,並且新程序會被當做被除錯的程序。系統把被除錯程式發生的所有除錯事件通知給偵錯程式。如果你使用這個標誌建立程序,只有呼叫程序(呼叫CreateProcess函式的程序)可以呼叫WaitForDebugEvent函式。⑼值:DEBUG_ONLY_THIS_PROCESS含義:如果此標誌沒有被設定且呼叫程序正在被除錯,新程序將成為除錯呼叫程序的偵錯程式的另一個除錯物件。如果呼叫程序沒有被除錯,有關除錯的行為就不會產生。⑽值:DETACHED_PROCESS含義:對於控制檯程序,新程序沒有訪問父程序控制檯的許可權。新程序可以通過AllocConsole函式自己建立一個新的控制檯。這個標誌不可以與CREATE_NEW_CONSOLE標誌一起使用。⑽值:CREATE_NO_WINDOW含義:系統不為新程序建立CUI視窗,使用該標誌可以建立不含視窗的CUI程式。dwCreationFlags:還用來控制新程序的優先類,優先類用來決定此程序的執行緒排程的優先順序。如果下面的優先順序類標誌都沒有
                          被指定,那麼預設的優先類是NORMAL_PRIORITY_CLASS,除非被建立的程序是IDLE_PRIORITY_CLASS
                          在這種情況下子程序的預設優先類是IDLE_PRIORITY_CLASS。可以選擇下面的標誌中的一個:優先順序:HIGH_PRIORITY_CLASS含義:指示這個程序將執行時間臨界的任務,所以它必須被立即執行以保證正確。這個優先順序的程式優先於正常優先順序或空閒優先順序的程式。一個例子是Windows任務列表,為了保證當用戶呼叫時可以立刻響應,放棄了對系統負荷的考慮。確保在使用高優先順序時應該足夠謹慎,因為一個高優先順序的CPU關聯應用程式可以佔用幾乎全部的CPU可用時間。優先順序:IDLE_PRIORITY_CLASS含義:指示這個程序的執行緒只有在系統空閒時才會執行並且可以被任何高優先順序的任務打斷。例如螢幕保護程式。空閒優先順序會被子程序繼承。優先順序:NORMAL_PRIORITY_CLASS含義:指示這個程序沒有特殊的任務排程要求。優先順序:REALTIME_PRIORITY_CLASS含義:指示這個程序擁有可用的最高優先順序。一個擁有實時優先順序的程序的執行緒可以打斷所有其他程序執行緒的執行,包括正在執行重要任務的系統程序。例如,一個執行時間稍長一點的實時程序可能導致磁碟快取不足或滑鼠反映遲鈍。lpEnvironment :指向一個新程序的環境塊。如果此引數為空,新程序使用呼叫程序的環境。一個環境塊存在於一個由以NULL結尾的字串組成的塊中,這個塊也是以NULL結尾的。每個字串都是name=value的形式。因為相等標誌被當做分隔符,所以它不能被環境變數當做變數名。與其使用應用程式提供的環境塊,不如直接把這個引數設為空,系統驅動器上的當前目錄資訊不會被自動傳遞給新建立的程序。對於這個情況的探討和如何處理,請參見注釋一節。環境塊可以包含Unicode或ANSI字元。如果lpEnvironment指向的環境塊包含Unicode字元,那麼dwCreationFlags欄位的CREATE_UNICODE_ENⅥRONMENT標誌將被設定。如果塊包含ANSI字元,該標誌將被清空。請注意一個ANSI環境塊是由兩個零位元組結束的:一個是字串的結尾,另一個用來結束這個快。一個Unicode環境塊是由四個零位元組結束的:兩個代表字串結束,另兩個用來結束塊。lpCurrentDirectory:指向一個以NULL結尾的字串,這個字串用來指定子程序的工作路徑。這個字串必須是一個包含驅動器名的絕對路徑。如果這個引數為空,新程序將使用與呼叫程序相同的驅動器和目錄。這個選項是一個需要啟動應用程式並指定它們的驅動器和工作目錄的外殼程式的主要條件。lpStartupInfo:   指向一個用於決定新程序的主窗體如何顯示的STARTUPINFO結構體lpProcessInformation: 指向一個用來接收新程序的識別資訊的PROCESS_INFORMATION結構體。