系統在創建新的進程時會爲新進程指定一個STARTUPINFO類型的變量,這個結構包含了父進程傳遞給子進程的一些顯示信息
一個進程可以調用GetStartupInfo函數來取得父進程創建自己時使用的STARTUPINFO結構。
函數定義:VOID GetStartupInfo(LPSTARTUPINFO lpStartupInfo);
定義一個STARTUPINFO結構的對象後,總要在使用此對象前將對象的cb成員初始化爲STARTUPINFO結構的大小:
STARTUPINFOsi={sizeof(si)};
::GetStartupInfo(&si);
typedef struct _STARTUPINFO{
DWORD cb; //本結構的長度,總是應該被設爲sizeof(STARTUPINFO)
LPTSTR lp[微軟用戶1] Reserved; //保留(Reserve)字段,即程序不適用這個參數
LPTSTR [微軟用戶2] lpDesktop; //指定桌面名稱
LPTSTR lpTitle; //控制檯應用程序使用,指定控制檯窗口標題
DWORD dwX; //指定新創窗口的位置座標(dwX,dwY)和大小信息
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars; //控制檯程序使用,指定控制檯窗口的行數
DWORD dwYCountChars;
DWORD dwFillAttribute; //控制檯程序使用,指定控制檯窗口的背景顏色
DWORD dwFlags;//標誌。它的值決定STARTUPINFO結構中哪些成員的值是有效的
WORD wShowWindow; //窗口顯示方式
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput; //控制檯程序使用,幾個標準句柄
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO,*LPSTARTUPINFO;
CreateProcess函數創建一個新的進程和該進程的主進程。新的進程會在父進程的安全上下文中運行指定的可執行文件。
如果系統能夠成功創建新的進程和進程的主線程,CreateProcess函數會返回TRUE,否則返回FALSE。
BOOL CreateProcess
(
LPCTSTR lpApplicationName, //可執行文件的名稱
LPTSTR lpCommandLine, //指定了要傳遞給執行模塊的參數
LPSECURITY_ATTRIBUTES lpProcessAttributes,//進程安全性,NULL表示使用默認值
LPSECURITY_ATTRIBUTES lpThreadAttributes,//線程安全性,NULL表示使用默認值
BOOL bInheritHandles, //指定了當前進程中的可繼承句柄是否被新進程繼承
DWORD dwCreationFlags, //指定了新進程的優先級以及其他創建標誌
LPVOID lpEnvironment, //指定新進程使用的環境變量
LPCTSTR lpCurrentDirectory, //新進程使用的當前目錄
LPSTARTUPINFO lpStartupInfo, //指定新進程中主窗口的位置、大小和標準句柄
LPPROCESS_INFORMATION lpProcessInformation//[out]返回新建進程的標誌信息,如ID號、句柄等
);
舉例(打開記事本):
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
char* szCommandLine="notepad";
::CreateProcess(NULL,szCommandLine,NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi);
修改:char*szCommandLine="notepad ReadMe.txt";
lpProcessInformation參數是一個指向PROCESS_INFORMATION結構的指針。CtraeteProcess函數會在返回之前初始化此結構的成員。結構定義如下:
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; //新建過程句柄
HANDLE hThread; //新建進程中主線程的內核句柄
DWORD dwProcessId; //新建進程的ID
DWORD dwThreadId; //新建進程的主線程ID
}PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
創建一個新進程會促使系統創建一個進程內核對象和一個線程內核對象。在CreateProcess函數返回前,這個函數打開此進程內核對象和線程內核對象的句柄,並將它們的值傳給上述結構的hPROCESS和hThread成員。