Createprocess 函数 调用出错以及解决

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 // 新进程返回的信息  
);  

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值