在调用_wsystem时执行psexec的问题

时间:2014-09-18 15:09:50

标签: c++ windows cmd psexec

从我的本机应用程序中,我必须在本地网络上的另一台计算机上启动另一个应用程序(toolB.exe)。要做到这一点,我使用psexec和_wsystem调用。现在,我试图在同一台计算机上而不是在远程计算机上启动toolB。所以在我的代码中我有这个:

const std::wstring command = L"\"" + psexecfull + L"\" " + psexecargs + L" -c -f -d -s -n 10 \"" + toolpathfull + L"\" " + toolargs;
int exitcode = _wsystem(nullptr);
wchar_t buffer[1024];
_wgetcwd(buffer, _countof(buffer));
exitcode = _wsystem(command.c_str());

这告诉我找到命令解释器(第一次调用带有nullptr的_wsystem返回1),并且当前工作目录是C:\project\bin\tools\toolA,并且命令(C:\project\externals\psexec\tools\psexec.exe \\127.0.0.1 -c -f -d -s -n 10 C:\project\bin\tools\toolB\toolB.exe -arg)失败(第二次)使用命令调用_wsystem返回1,文本The filename, directory name, or volume label syntax is incorrect出现在我的应用程序控制台窗口中)。也许我还应该提一下这段本机代码在一个包含C ++(本机)和C ++ / CLI(托管)代码的DLL中,并且由一个名为toolA的.NET应用程序(在我认为的同一个AppDomain中)动态加载和执行。

但是,奇怪的是,当我从完全相同的工作目录中执行完全相同的命令行时,psexec运行正常并且toolB.exe按预期启动。那么为什么这不能以编程方式调用_wsystem?我该如何解决这个问题?

我正在运行Windows 7 x64,如果重要的话。

1 个答案:

答案 0 :(得分:1)

确定所以在命令行上的手动尝试结果不是完全相同的命令行文本,我没有使用封装“”作为psexec和toolB可执行文件。为psexec可执行文件留下封闭的“”,所以显然_wsystem不允许用“”括起第一个参数。这很奇怪,因为如果psexec位于带空格的路径中,则在尝试解析psexec路径时,对_wsystem的调用将失败。我还不确定如何克服这一点。

除此之外,对_wsystem的调用也返回了toolB.exe的进程ID,而我期待0,但这是另一个问题。