从我的本机应用程序中,我必须在本地网络上的另一台计算机上启动另一个应用程序(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中)动态加载和执行。
我正在运行Windows 7 x64,如果重要的话。
答案 0 :(得分:1)
确定所以在命令行上的手动尝试结果不是完全相同的命令行文本,我没有使用封装“”作为psexec和toolB可执行文件。为psexec可执行文件留下封闭的“”,所以显然_wsystem不允许用“”括起第一个参数。这很奇怪,因为如果psexec位于带空格的路径中,则在尝试解析psexec路径时,对_wsystem的调用将失败。我还不确定如何克服这一点。
除此之外,对_wsystem的调用也返回了toolB.exe的进程ID,而我期待0,但这是另一个问题。