CreateProcess参数
发布时间:2025-05-18 16:35:47 发布人:远客网络
一、CreateProcess参数
在创建进程时,需要提供一系列参数来指定进程的运行细节。以下是对这些参数的详细说明:
1. lpApplicationName:这个参数指向一个字符串,指定要运行的可执行模块。这个字符串可以是绝对路径或相对路径,如果为相对路径,则使用当前驱动器和目录构造完整路径。如果lpApplicationName为NULL,可执行模块的名字应位于lpCommandLine参数的前面,并用空格分隔。16位应用程序在Windows NT中应设置为NULL,并在lpCommandLine中指定可执行模块名称。
2. lpCommandLine:这个参数是一个字符串,指定了要执行的命令行。如果为空,系统使用lpApplicationName指定的字符串作为命令行。如果lpApplicationName和lpCommandLine都非空,则lpApplicationName指定要运行的模块,而lpCommandLine指定模块的命令行。新进程可以通过GetCommandLine获取完整的命令行。在C语言程序中,可通过argc和argv参数来处理。
3. lpProcessAttributes:此参数为SECURITY_ATTRIBUTES结构体指针,决定返回的句柄是否可以被子进程继承。若为NULL,句柄不可继承。在Windows NT中,lpProcessAttributes的lpSecurityDescriptor成员指定了新进程的安全描述符;Windows 95中则忽略此成员。
4. lpThreadAttributes:此参数同样为SECURITY_ATTRIBUTES结构体指针,决定返回的线程句柄是否可被子进程继承。在Windows NT中,lpThreadAttributes的lpSecurityDescriptor成员指定了主线程的安全描述符;Windows 95中忽略此成员。
5. bInheritHandles:此参数指示新进程是否继承调用进程的可继承句柄。如果为真,调用进程中的所有可继承句柄都将被子进程继承,且继承的句柄具有相同的值和访问权限。
6. dwCreationFlags:此参数用于控制进程的创建标志,包含多个标志以影响进程的优先级、控制台、线程等。例如,CREATE_NEW_CONSOLE标志允许新进程使用独立控制台;CREATE_SUSPENDED标志创建暂停状态的进程;CREATE_UNICODE_ENVIRONMENT标志指示环境块使用Unicode字符。
7. lpEnvironment:此参数为新进程的环境块指针,提供运行环境变量。可以为空,使用调用进程的环境,或自定义环境。环境块包含以NULL结尾的name=value字符串。
8. lpCurrentDirectory:指定新进程的工作路径,必须为绝对路径。若为空,则使用调用进程的路径。
9. lpStartupInfo:用于配置新进程主窗口显示的STARTUPINFO结构体指针。
10. lpProcessInformation:指向接收新进程识别信息的PROCESS_INFORMATION结构体,包含进程ID、线程ID等。
WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。
二、createprocess出错的原因是什么
使用CFileDialog选择文件了以后,会在其内部调用“SetCurrentDirectory“设置被选择文件的目录为当前路径。
因此如果文件和程序不在同一路径,那么CreateProcess使用内部调用的相对路径就可能找不到对应程序,所以导致createprocess出现错误代码2的情况。解决办法是CreateProcess使用可执行文件的绝对路径便可以解决文件和程序不在同一路径的问题。
指向一个NULL结尾的、用来指定可执行模块的字符串。
这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。
这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine参数最前面并由空格符与后面的字符分开。
指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。
如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。
新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。
指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。
同lpProcessAttribute,不过这个参数决定的是线程是否被继承,通常置为NULL。
三、C#的createprocess出错是什么原因
使用CFileDialog选择文件了以后,会在其内部调用“SetCurrentDirectory“设置被选择文件的目录为当前路径。
因此如果文件和程序不在同一路径,那么CreateProcess使用内部调用的相对路径就可能找不到对应程序,所以导致createprocess出现错误代码2的情况。解决办法是CreateProcess使用可执行文件的绝对路径便可以解决文件和程序不在同一路径的问题。
指向一个NULL结尾的、用来指定可执行模块的字符串。
这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。
这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine参数最前面并由空格符与后面的字符分开。
指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。
如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。
新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。
指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。
同lpProcessAttribute,不过这个参数决定的是线程是否被继承,通常置为NULL。