我试图从正在编写的某些C ++代码中解放Webots,但是遇到了一些问题。我正在运行的Webots版本是7.4.3(由于一些不相关的原因,我当时无法更新到8.1.0),它在解释命令行参数(https://www.cyberbotics.com/forum?message=5222)时存在一个已知的错误。

我想将特定文件作为参数传递,以便Webots打开它。这是Windows中用于处理此类文件的默认应用程序,因此,如果我只是将文件的路径放在命令行上,或者单击它,Webots就会打开它。我正在使用createProcess()从我的C ++程序调用webots,但是,将文件路径而不是程序可执行文件放置到路径中会引发错误(如预期的那样,因为该文件不是可执行文件)。

奇怪的是,使用“运行”窗口(而不是cmd.exe),我可以按假定的方式传递参数(http://www.cyberbotics.com/dvd/common/doc/webots/guide/section2.2.html)。

应该注意的是,Webots安装程序提供了webots.exewebots.bat,我认为它们在Windows中包括其他库路径,因为如果尝试运行webots.exe,我会得到“缺少[.dll]”。

因此,关于此问题,我有两个问题:

1)“运行”窗口和命令行之间到底有什么区别,因为它们在调用同一命令时会表现出不同的行为?

2)是否可以使用createProcess()调用“运行”窗口并发送要作为参数运行的命令?

编辑:

我正在编译的代码的相关片段:

//[...]
LPTSTR cmdArgs="C:\\path\\to\\file":
STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;

if(CreateProcess("C:\\Program Files (x86)\\Webots\\webots.bat", cmdArgs,
    NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,
    NULL,&StartupInfo,&ProcessInfo))
{
    WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
} else {
    printf("Unable to execute");
}
//[...]


这样,Webots将打开,但不会打开cmdArgs文件,或者,如果在调用Unable to execute时将cmdArgs作为第一个参数(NULL作为第二个参数),则会得到createProcess()-我不知道的特定错误知道,必须更改代码才能捕获它。

编辑2:

Webots.bat:

@echo off
setlocal
set Path=%CD%\lib;%CD%\mingw\bin;%CD%\msys\bin;%Path%
start webots.exe

最佳答案

这就是我的想法。这是CreateProcess official doc

尝试这个:

LPTSTR cmdArgs = TEXT("/c \"C:\\Program Files (x86)\\Webots\\webots.bat\" \"C:\\path\\to\\file\"");
// The other statements
if(CreateProcess(TEXT("cmd.exe"), cmdArgs, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL,
 NULL, &info, &processInfo))
// The rest of the statements


已经做了什么:


根据上面的链接,lpCommandLine字符串中的第一个标记是程序(应用程序)名称。就像在main中一样,argc[0]是可执行文件的名称。运行.bat文件时例外(这正是我们的情况);然后应将lpApplicationName设置为cmd.exe,并将lpCommandLine设置为/c,后跟批处理名称(和args)。
根据同一文档,如果路径名包含空格(并且在您的情况下,则包含空格),则必须将其包含在"中。
我假设粘贴代码时出现错字,否则将无法编译。 CreateProcess的最后两个参数不正确(我将&StratupInfo替换为&info,将&ProcessInfo替换为&processInfo)。
我做的最后一件事是通过TEXT宏将程序中的所有文字字符串括起来。编写同时使用ASCII和WideChar字符串的程序时,这是必需的。尽管由于未定义UNICODE_UNICODE宏,它对您的代码没有任何明显的不同,但这意味着您的程序使用ASCII字符串(嗯,我想知道为什么是这样,因为默认情况下Visual Studio定义了它们) ;除非您手动取消定义它们),但是如果您定义(或更优:取消定义)它们,您会遇到一堆编译错误,这些错误乍一看是没有意义的。

关于c++ - 用`createProcess()`调用Webot时传递参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30986351/

10-12 07:09