我尝试使用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应该出现在同一文件夹中)。
我可能会缺少一些东西吗?
答案 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;
}
答案 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。
希望这会有所帮助