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
    评论
可以使用 Windows API 中的 `CreateProcess` 函数创建一个新的进程,并在其中运行 MATLAB 的 `matlab.exe` 程序,从而运行 MATLAB 程序。具体步骤如下: 1. 编译 MATLAB 代码,生成可执行文件 `mycode.exe`。 2. 在 C++ 代码中使用 `CreateProcess` 函数创建新的进程,并指定要运行的程序和传递的参数。示例如下: ```c++ #include <windows.h> #include <iostream> int main() { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); // 指定要运行的程序和参数 TCHAR command[] = TEXT("matlab.exe -r \"mycode('arg1', 'arg2', ...)\""); // 创建新进程 if (!CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { std::cerr << "CreateProcess failed: " << GetLastError() << std::endl; return 1; } // 等待进程结束 WaitForSingleObject(pi.hProcess, INFINITE); // 获取进程的退出码 DWORD exitCode; if (!GetExitCodeProcess(pi.hProcess, &exitCode)) { std::cerr << "GetExitCodeProcess failed: " << GetLastError() << std::endl; return 1; } std::cout << "Process exited with code " << exitCode << std::endl; // 关闭进程和线程句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; } ``` 其中,`arg1`、`arg2` 等为传递给 MATLAB 程序的参数,可以根据需要进行修改。 需要注意的是,使用 `CreateProcess` 函数创建进程时,需要指定一些参数,如进程的安全属性、是否继承父进程的句柄等。在本例中,我们将这些参数都设为 `NULL` 或 `0`,表示使用默认值。如果需要更详细地控制进程的创建和运行,可以参考相关的 Windows API 文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值