c++ - 链接多个 ShellExecute 调用

标签 c++ winapi shellexecute

考虑以下代码及其可执行文件 - 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/

相关文章:

c++ - Clang 文档页面中的代码片段

c++ - 确定网络连接链接速度

python - 在 Windows XP 中从 C++ 程序执行 Python 脚本

c++ - Linux乐观malloc : will new always throw when out of memory?

c++ - MFC:如何在单击按钮时最小化窗口?

c++ - 为什么在 C++ 中需要动态数组?

asp.net - 使用httpSendRequest c++上传文件

python - 告诉窗口在哪个监视器上显示对话框

c++ - 以编程方式在默认浏览器中打开多个 URL

mysql - 如何从 MySQL 函数或触发器中进行 shell 调用