先来看看CreateProcess的定义
BOOL CreateProcess (
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PROCESS_INFORMATION ppiProcInfo
)
第一个参数为程序名,不能省略.exe,如果为NULL的话,就默认第二个字符串的前面一段是程序名
第二个参数是PTSTR,因此不能传递一个常量字符串
第三个和第四个参数中有个hInheritHandles的成员,举个例子来说,A生成B,C,D......,B的这两个参数决定了其进程和线程的句柄是否能被C,D...所继承
但是第五个参数相当于一个总开关,不管前面怎么设置,但是一旦bInheritHandles为FALSE,则所有的句柄都不能被父进程A继承
第六个参数fdwCreate有多个flag,参见中文版p89.
DEBUG_PROCESS,DEBUG_ONLY_THIS_PROCESS 表示调试子进程,后面的那个参数表示A调试B,但是B生成C,A只会收到任何从B到达的事件
CREATE_SUSPENDED 创建时挂起进程
DETACHED_PROCESS 字面意思分离进程,假设一个CUI程序A生成了另一个CUI程序B,默认B会使用A的控制台,这个参数组织这类情况,并且指定一个额外的控制台让B输出
CREATE_NEW_CONSOLE 表示为新进程创建一个新的控制台,不能与上面的混用
CREATE_NO_WINDOW 指示不要为进程创建任何控制台窗口
CREATE_NEW_PROCESS_GROUP 父进程A生成了一组进程,如果某一个cui获得了ctrl-c ctrl+break 整组的进程都讲获得这个信息
CRREATE_DEFAULT_ERROR_MODE 进程不会继承父进程的error mode,而是默认的
CREATE_SEPARATE_WOW_VDM 只有当程序是16位才有用,表示为其创建一个新的DOS虚拟机
CREATE_SHARED_WOW_VDM 只有当程序是16位才有用,表示所有的16位程序都在一个DOS虚拟机中(同时这也是默认情况,可修改注册表改变这种情况)
CREATE_UNICODE_ENVIRONMENT 进程的环境块为unicode,默认和ansi
CREATGE_FORCEDOS 强制系统一个嵌入在16位OS/2应用程序中的MS-DOS程序
CREATE_BREAKWAY_FROM_JOB
EXTENDED_STARTUPINFO_PRESENT 表示psiStartInof是个STARTINFOEX结构
同时还可以指定优先级
IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRI...
NORMAL_PRI...
ABOVE_PRI...
HIGH_PRI...
REALTIME_PRI...
第六个参数当传入NULL,默认继承父进程的环境变量
第七个参数可以更改运行目录
第八个参数的定义如下
typedef struct _STARTUPINFO
{
cb,
lpReserved,
lpDesktop,
lpTitle,
dwX,
dwY,
dwXSize,
dwYSize,
dwXCountChars,
dwYCountChars,
dwFillAttribute,
dwFlags,
wShowWindow,
cbReserved2,
lpReserved,
hStdInput,
hStdOutput,
hStdError
}STARTUPINFO, *LPSTARTUPINFO
前面几个参数从字面意思就可以推导出来是做什么的,注意有些参数只有当子进程用了DEFAULT参数才会生效,最后的三个参数可以用来重定向
dwFlags决定哪些参数生效,例如STARTF_USESIZE,另外还有两个参数决定是否在生成子进程的过程中给个视觉反馈
STARTF_FORCEONFRRDBACK STARTF_FORCEOFFFEEDBACK
STARTUPINFOEX只比它多了一个参数lpAttributeList,它的设置可以设置子进程可以从父进程继承哪些句柄,并且可以更改父子进程的关系,详情参见p96-97
最后一个参数ppiProcInfo,有以下几个成员
hProcess,
hThread,
dwProcessId,
dwThreadId