如何在C ++中使用CreateProcessW运行具有多个参数的exe

时间:2019-07-15 08:57:04

标签: c++ winapi createprocess

我尝试使用this example在C ++中使用CreateProcessW()运行外部程序,但是,当我使用多个参数时,此代码似乎不起作用。

就我而言,我通过以下路径:

std::string pathToExe = "C:\\Users\\Aitor - ST\\Documents\\QtProjects\\ErgoEvalPlatform\\ErgonomicEvaluationPlatform\\FACTS\\xsim-runner.exe"

和以下参数:

std::string arguments = "--model=facts_input.xml --output_xml=something.xml"

这些参数在cmd上有效,但是当我从C ++使用它们时,它们似乎未提供任何输出(xml应该出现在同一文件夹中)。

我可能会缺少一些东西吗?

3 个答案:

答案 0 :(得分:0)

从您显示的代码中可以推断出两个潜在的问题。

参数前的空格

根据将参数字符串连接到可执行字符串的方式,您可能会在参数之前错过一个空格。没有代码,就无法分辨,但是尝试像这样更改参数字符串:

std::string arguments = " --model=facts_input.xml --output_xml=something.xml;"

当前目录

CreateProcess生成一个子进程,该子进程从其父进程继承当前目录。您在参数上指定的XML文件使用相对路径。

尝试指定要在参数中传递的XML文件的完整路径,如下所示:

std::string arguments = " --model=\"C:\\Users\\Aitor - ST\\Documents\\QtProjects\\ErgoEvalPlatform\\ErgonomicEvaluationPlatform\\FACTS\\facts_input.xml\" --output_xml=\"C:\\Users\\Aitor - ST\\Documents\\QtProjects\\ErgoEvalPlatform\\ErgonomicEvaluationPlatform\\FACTS\\something.xml\"";

答案 1 :(得分:0)

以下是显示“如何使用C ++中的CreateProcessW运行具有多个参数的exe”的示例。您可以检查是否有帮助。

启动器应用程序(控制台应用程序):

#include <iostream>
#include <windows.h>

int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi; // The function returns this
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    CONST wchar_t* commandLine = TEXT("arg1 arg2 arg3");

    // Start the child process.
    if (!CreateProcessW(
        L"D:\\Win32-Cases\\TestTargetApp\\Debug\\TestTargetApp.exe",      // app path
        (LPWSTR)commandLine,     // Command line 
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory
        &si,            // Pointer to STARTUPINFO structure
        &pi)           // Pointer to PROCESS_INFORMATION structure
        )
    {
        printf("CreateProcess failed (%d).\n", GetLastError());
        throw std::exception("Could not create child process");
    }
    else
    {
        std::cout << "[          ] Successfully launched child process" << std::endl;
    }
}

将要启动的目标应用程序(另一个控制台应用程序):

#include <iostream>
#include <windows.h>

int main(int argc, char *argv[])
{
    if (argc > 0)
    {
        for (int index = 0; index < argc; index++)
        {
            std::cout << argv[index] << std::endl;
        }
    }

    return 1;
}

enter image description here

答案 2 :(得分:-1)

您必须在参数中传递完整的命令行,如下所示:

std::string arguments = "C:\\Users\\Aitor-ST\\Documents\\QtProjects\\ErgoEvalPlatform\\ErgonomicEvaluationPlatform\\FACTS\\xsim-runner.exe --model=facts_input.xml --output_xml=something.xml"

CreateProcessW的第二个参数需要完整的命令行,而不仅仅是参数。它将其传递给进程,如果目标进程是采用agrs的C程序,则照常,第一个参数将是模块名称,后面的其他参数将是args。

希望这会有所帮助