首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用` `createProcess()`调用Webots时传递参数

使用` `createProcess()`调用Webots时传递参数
EN

Stack Overflow用户
提问于 2015-06-23 01:36:41
回答 1查看 140关注 0票数 1

我试图从我正在编写的一些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.exewebots.bat,我假设它们包含了Windows中的其他库路径,因为如果我尝试运行webots.exe,就会得到"missing ....dll“

关于这个问题,我有两个问题:

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

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

编辑:

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

代码语言:javascript
复制
//[...]
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:

代码语言:javascript
复制
@echo off
setlocal
set Path=%CD%\lib;%CD%\mingw\bin;%CD%\msys\bin;%Path%
start webots.exe
EN

回答 1

Stack Overflow用户

发布于 2015-06-23 15:43:12

我也是这么想的。这里是CreateProcess official doc

试试这个:

代码语言:javascript
复制
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

已经完成了哪些工作:

  1. 根据上面的链接,lpCommandLine字符串中的第一个标记是程序(应用程序)名称。就像在main中,argc[0]是可执行文件的名称。例外情况是在运行.bat文件时(这正是我们的情况);然后lpApplicationName应该设置为cmd.exe,后面跟批次名称的lpCommandLine (和指向同一文档的args).
  2. According,如果路径名包含空格(在您的示例中是空格),则必须将它们括在"s.
  3. I中)假定粘贴代码时存在拼写错误,否则将无法编译。CreateProcess的最后两个参数不正确(我用&processInfo).
  4. The替换了&StratupInfo,用&info替换了&ProcessInfo ),最后做的一件事是用TEXT宏将程序中的任何文字字符串封闭起来。当编写同时使用ASCII码和WideChar字符串的程序时,这是必需的。虽然这对您的代码没有任何明显的影响,因为您没有定义UNICODE和ASCII宏,这意味着您的程序使用ASCII宏(嗯,我想知道为什么,因为默认情况下Visual Studio定义它们;除非您手动取消定义它们),但是如果您定义它们(或者更好的做法是取消定义),您会得到一堆乍一看毫无意义的编译错误。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30986351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档