CreateProcess函数用来创建一个进程,在参数中有一个就是执行的命令。这个值在createprocess函数内部是会被改变的,所以在传递参数的时候不允许传const类型常量。
如以下方法不允许
1:CreateProcess(NULL,_T("calc.exe'),NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
2:
const TCHAR sCmd[]=_T("calc.exe");
CreateProcess(NULL, sCmd,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
尽量用以下方法:
CString strCMD;
strCMD= _T("calc.exe");
CreateProcess(NULL,strCMD.GetBuffer(),NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
或:
TCHAR sCmd[]=_T("calc.exe");
CreateProcess(NULL, sCmd,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
如果用1 2 两种写法会导致在执行到CreateProcess时程序出错
BOOL CreateProcess(
LPCTSTR lpApplicationName, // 应用程序名称
LPTSTR lpCommandLine, // 命令行字符串
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性
//ECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
//typedef struct _SECURITY_ATTRIBUTES {
// DWORD nLength; //结构体的大小,可用sizeof取得
// LPVOID lpSecurityDescriptor; //安全描述符
// BOOL bInheritHandle ;//安全描述的对象能否被新创建的进程继承
//} SECURITY_ATTRIBUTES,* PSECURITY_ATTRIBUTES;
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性,跟进程的安全属性一样,只不过这是线程的属性
BOOL bInheritHandles, // 是否继承父进程的属性(父进程可继承的打开句柄)
DWORD dwCreationFlags, // 创建标志
//CREATE_DEFAULT_ERROR_MODE:新的进程不继承调用进程的错误模式,默认的行为是为新进程继承调用者的错误模式(可以指定该标志修改)
//CREATE_NEW_CONSOLE:新的进程将使用一个新的控制台,而不是继承父进程的控制台。这个标志不能与DETACHED_PROCESS标志一起使用
//CREATE_NEW_PROCESS_GROUP:新进程将是一个进程树的根进程。进程树中的全部进程都是根进程的子进程。
//CREATE_SEPARATE_WOW_VDM:DOS环境相关,现在无用途
//CREATE_SHARED_WOW_VDM:DOS环境相关,现在无用途
//CREATE_SUSPENDED:新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行
//CREATE_UNICODE_ENVIRONMENT:如果被设置,由lpEnvironment参数指定的环境块使用Unicode字符,如果为空,环境块使用ANSI字符
//DEBUG_PROCESS:如果这个标志被设置,调用进程将被当做一个调试程序,并且新进程会被当做被调试的进程
//DEBUG_ONLY_THIS_PROCESS:如果此标志没有被设置且调用进程正在被调试,新进程将成为调试调用进程的调试器的另一个调试对象
//DETACHED_PROCESS:对于控制台进程,新进程没有访问父进程控制台的权限。新进程可以通过AllocConsole函数自己创建一个新的控制台。这个标志不可以与CREATE_NEW_CONSOLE标志一起使用。
//CREATE_NO_WINDOW:系统不为新进程创建CUI窗口,使用该标志可以创建不含窗口的CUI程序。
LPVOID lpEnvironment, // 指向新的环境块的指针,指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。
LPCTSTR lpCurrentDirectory, // 指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。
LPSTARTUPINFO lpStartupInfo, // 传递给新进程的信息
LPPROCESS_INFORMATION lpProcessInformation // 新进程返回的信息
);