CreateProcess函数详解及示例

来源:互联网 发布:sql查询字段包含字母 编辑:程序博客网 时间:2024/05/17 23:51
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