考虑以下代码及其可执行文件 - runner.exe
:
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main(int argc, char *argv[])
{
SHELLEXECUTEINFO shExecInfo;
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExecInfo.fMask = NULL;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = "open";
shExecInfo.lpFile = argv[1];
string Params = "";
for ( int i = 2; i < argc; ++i )
Params += argv[i] + ' ';
shExecInfo.lpParameters = Params.c_str();
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_SHOWNORMAL;
shExecInfo.hInstApp = NULL;
ShellExecuteEx(&shExecInfo);
return 0;
}
这两个批处理文件都做了它们应该做的事情,即运行 notepad.exe 并运行 notepad.exe 并告诉它尝试打开 test.txt:
1.
runner.exe notepad.exe
2.
runner.exe notepad.exe test.txt
现在,考虑这个批处理文件:
3.
runner.exe runner.exe notepad.exe
这应该运行 runner.exe 并将 notepad.exe 作为其命令行参数之一发送,不是吗?然后,runner.exe 的第二个实例应该运行 notepad.exe——这并没有发生,我得到一个“Windows 找不到‘am’。确保你输入的名称正确,然后再试一次”的错误。如果我打印 argc
参数,runner.exe 的第二个实例是 14,它们都是奇怪的东西,如 Files\Microsoft、SQL、Files\Common 等等在。我不明白为什么会这样。我希望能够使用命令行参数串接尽可能多的 runner.exe 调用,或者至少 2 个。我该怎么做?
如果有差异,我正在使用 Windows 7。
最佳答案
你在这一行中有一个错误:
Params += argv[i] + ' ';
这会将 32 添加到指针 argv[i]
,这不是您想要的。您可以将它分成两行:
Params += argv[i];
Params += ' ';
或者使用:
Params += string(argv[i]) + ' ';
您可能还想在每个参数周围添加引号,以防它包含空格。
我还将 fMask
设置为 SEE_MASK_NOASYNC
,因为 MSDN 指出:
Applications that exit immediately after calling ShellExecuteEx should specify this flag.
关于c++ - 链接多个 ShellExecute 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2448802/