WIN32API函數CreateProcess用來創建一個新的進程和它的主線程,這個新進程運行指定的可執行文件。 函數原型: 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 ); lpApplicationName:指向一個NULL結尾的、用來指定可執行模塊的字符串。 這個字符串可以使可執行模塊的絕對路徑,也可以是相對路徑,在后一種情況下,函數使用當前驅動器和目錄建立可執行模塊的路徑。 這個參數可以被設為NULL,在這種情況下,可執行模塊的名字必須處於 lpCommandLine 參數的最前面並由空格符與后面的字符分開。
lpCommandLine:指向一個NULL結尾的、用來指定要運行的命令行。 這個參數可以為空,那么函數將使用參數指定的字符串當作要運行的程序的命令行。 如果lpApplicationName和lpCommandLine參數都不為空,那么lpApplicationName參數指定將要被運行的模塊,lpCommandLine參數指定將被運行的模塊的命令行
。新運行的進程可以使用GetCommandLine函數獲得整個命令行。
lpProcessAttributes:指向一個SECURITY_ATTRIBUTES結構體,這個結構體決定是否返回的句柄可以被子進程繼承。如果lpProcessAttributes參數為空(NULL)
,那么句柄不能被繼承。
lpThreadAttributes:指向一個SECURITY_ATTRIBUTES結構體,這個結構體決定是否返回的句柄可以被子進程繼承。如果lpThreadAttributes參數為空(NULL),
那么句柄不能被繼承。
bInheritHandles:指示新進程是否從調用進程處繼承了句柄。如果參數的值為真,調用進程中的每一個可繼承的打開句柄都將被子進程繼承。被繼承的句柄與原
進程擁有完全相同的值和訪問權限。
dwCreationFlags:指定附加的、用來控制優先類和進程的創建的標志。
lpEnvironment:指向一個新進程的環境塊。如果此參數為空,新進程使用調用進程的環境。 一個環境塊存在於一個由以NULL結尾的字符串組成的塊中,這個塊也是以NULL結尾的。每個字符串都是name=value的形式。 lpCurrentDirectory:指向一個以NULL結尾的字符串,這個字符串用來指定子進程的工作路徑。這個字符串必須是一個包含驅動器名的絕對路徑。如果這個參數
為空,新進程將使用與調用進程相同的驅動器和目錄。這個選項是一個需要啟動啟動應用程序並指定它們的驅動器和工作目錄的外殼程序的主要條件。
lpStartupInfo:指向一個用於決定新進程的主窗體如何顯示的STARTUPINFO結構體。
lpProcessInformation:指向一個用來接收新進程的識別信息的PROCESS_INFORMATION結構體。
STARTUPINFO結構體
typedef struct _STARTUPINFO { DWORD cb; //包含STARTUPINFO結構中的字節數.如果Microsoft將來擴展該結構,它可用作版本控制手段. 應用程序必須將cb初始化為sizeof(STARTUPINFO) PSTR lpReserved; //保留。必須初始化為N U L L PSTR lpDesktop; //用於標識啟動應用程序所在的桌面的名字。如果該桌面存在,新進程便與指定的桌面相關聯。 如果桌面不存在,便創建一個帶有默認屬性的桌面,並使用為新進程指定的名字。 如果lpDesktop是NULL(這是最常見的情況),那么該進程將與當前桌面相關聯 PSTR lpTitle; //用於設定控制台窗口的名稱。如果l p Ti t l e 是N U L L ,則可執行文件的名字將用作窗口名 DWORD dwX; //用於設定應用程序窗口在屏幕上應該放置的位置的x 和y 坐標(以像素為單位)。 DWORD dwY; 只有當子進程用CW_USEDEFAULT作為CreateWindow的x參數來創建它的第一個重疊窗口時, 才使用這兩個坐標。若是創建控制台窗口的應用程序,這些成員用於指明控制台窗口的左上角
DWORD dwXSize; //用於設定應用程序窗口的寬度和長度(以像素為單位)只有dwYsize DWORD dwYSize; 當子進程將C W _ U S E D E FA U LT 用作C r e a t e Wi n d o w 的 n Wi d t h參數來創建它的第一個重疊窗口時,才使用這些值。 若是創建控制台窗口的應用程序,這些成員將用於指明控制台窗口的寬度 DWORD dwXCountChars; //用於設定子應用程序的控制台窗口的寬度和高度(以字符為單位) DWORD dwYCountChars; DWORD dwFillAttribute; //用於設定子應用程序的控制台窗口使用的文本和背景顏色 DWORD dwFlags; //請參見下一段和表4 - 7 的說明 WORD wShowWindow; //用於設定如果子應用程序初次調用的S h o w Wi n d o w 將S W _ S H O W D E FA U LT 作為 n C m d S h o w 參數傳遞時,該應用程序的第一個重疊窗口應該如何出現。 本成員可以是通常用於Show Wi n d o w 函數的任何一個S W _ *標識符 WORD cbReserved2; //保留。必須被初始化為0 PBYTE lpReserved2; //保留。必須被初始化為N U L L HANDLE hStdInput; //用於設定供控制台輸入和輸出用的緩存的句柄。 按照默認設置,h S t d I n p u t 用於標識鍵盤緩存, h S t d O u t p u t 和h S t d E r r o r用於標識控制台窗口的緩存 HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO; 當Wi n d o w s 創建新進程時,它將使用該結構的有關成員。大多數應用程序將要求生成的應用程序僅僅使用默認值。至少應該將該結構中的所有成員初始化為
零,然后將c b 成員設置為該結構的大小: STARTUPINFO si = { sizeof(si) }; CreateProcess(...,&si,...);
dwFlags 使用標志及含義 標志 含義 STARTF_USESIZE // 使用d w X S i z e 和d w Y S i z e 成員 STARTF_USESHOWWINDOW //使用w S h o w Wi n d o w 成員 STARTF_USEPOSITION //使用d w X 和d w Y 成員 STARTF_USECOUNTCHARS //使用d w X C o u n t C h a r s 和dwYCount Chars 成員 STARTF_USEFILLATTRIBUTE //使用d w F i l l A t t r i b u t e 成員 STARTF_USESTDHANDLES //使用h S t d I n p u t 、h S t d O u t p u t 和h S t d E r r o r 成員 STARTF_RUN_FULLSCREEN //強制在x 8 6 計算機上運行的控制台應用程序以全屏幕方式啟動運行
PROCESS_INFORMATION結構體
typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
源代碼,保存為CPP文件,在VC++6下調試成功 #include <windows.h> void main() {
STARTUPINFO stStartUpInfo = {sizeof(stStartUpInfo)}; PROCESS_INFORMATION pProcessInfo; ZeroMemory(&stStartUpInfo, sizeof(STARTUPINFO)); stStartUpInfo.cb = sizeof(STARTUPINFO); stStartUpInfo.dwFlags=STARTF_USESHOWWINDOW ; stStartUpInfo.wShowWindow=1;//窗口顯示為0不顯示 char * appName= "c://windows//notepad.exe"; char * pCmdLine = "";
CreateProcess( appName,//應用程序名稱 pCmdLine, //命令行 NULL, //進程句柄不能被繼承 NULL, //線程句柄不能被繼承 FALSE, NULL, NULL, NULL, &stStartUpInfo, &pProcessInfo); CloseHandle