我试图从正在编写的某些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.exe
和webots.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/