我试图从我正在编写的一些C++代码中加载Webot,但遇到了一些问题。我正在运行的Webots的版本是7.4.3 (由于一些无关的原因,我当时无法更新到8.1.0 ),它在解释命令行参数(https://www.cyberbotics.com/forum?message=5222)时有一个已知的错误。
我想传递一个特定的文件作为参数,以便Webots打开它。这是Windows中处理这类文件的默认应用程序,因此,如果我只是将文件的路径放在命令行上,或者只是单击它,它就会被Webots打开。我正在使用createProcess()从我的C++程序中调用webot,但是,将文件的路径而不是程序的可执行文件放入其中,会抛出一个错误(不出所料,因为该文件不是可执行文件)。
奇怪的是,使用"Run“窗口(而不是cmd.exe),我可以像假设的那样传递参数(http://www.cyberbotics.com/dvd/common/doc/webots/guide/section2.2.html)。
应该注意的是,Webots安装程序提供了webots.exe和webots.bat,我假设它们包含了Windows中的其他库路径,因为如果我尝试运行webots.exe,就会得到"missing ....dll“
关于这个问题,我有两个问题:
1) "Run“窗口和command Line之间到底有什么区别,因为它们在调用同一命令时表现出不同的行为?
2)是否可以使用createProcess()调用" run“窗口并将要运行的命令作为参数发送?
编辑:
我正在编译的相关代码片段:
//[...]
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");
}
//[...]这样,Webot会打开,但不会打开cmdArgs文件,或者当我调用createProcess()时,如果我将cmdArgs作为第一个参数(NULL作为第二个参数),我会得到Unable to execute -具体的错误我不知道,必须更改代码来捕获它。
编辑2:
Webots.bat:
@echo off
setlocal
set Path=%CD%\lib;%CD%\mingw\bin;%CD%\msys\bin;%Path%
start webots.exe发布于 2015-06-23 15:43:12
我也是这么想的。这里是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 (和指向同一文档的args)."s.CreateProcess的最后两个参数不正确(我用&processInfo).&StratupInfo,用&info替换了&ProcessInfo ),最后做的一件事是用TEXT宏将程序中的任何文字字符串封闭起来。当编写同时使用ASCII码和WideChar字符串的程序时,这是必需的。虽然这对您的代码没有任何明显的影响,因为您没有定义UNICODE和ASCII宏,这意味着您的程序使用ASCII宏(嗯,我想知道为什么,因为默认情况下Visual Studio定义它们;除非您手动取消定义它们),但是如果您定义它们(或者更好的做法是取消定义),您会得到一堆乍一看毫无意义的编译错误。https://stackoverflow.com/questions/30986351
复制相似问题