首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接多个ShellExecute调用

链接多个ShellExecute调用
EN

Stack Overflow用户
提问于 2010-03-15 16:38:40
回答 3查看 2.3K关注 0票数 0

考虑以下代码及其可执行文件- runner.exe

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

代码语言:javascript
复制
1.
runner.exe notepad.exe

2.
runner.exe notepad.exe test.txt

现在,考虑一下这个批处理文件:

代码语言:javascript
复制
3.
runner.exe runner.exe notepad.exe

这个应该运行runner.exe并将notepad.exe作为其命令行参数之一发送,不是吗?然后,第二个runner.exe实例应该运行notepad.exe --这不会发生,我会得到一个“notepad.exe无法找到'am‘。请确保您键入的名称正确,然后再试一次”错误。如果我打印argc参数,它是14,用于runner.exe的第二个实例,它们都是奇怪的东西,比如Files\Microsoft、SQL、Files\等等。我搞不懂为什么会这样。我希望能够尽可能多地使用命令行参数或至少2来字符串runner.exe调用。

我正在使用Windows 7,如果这有区别的话。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-15 17:42:42

在这一行中有一个bug:

代码语言:javascript
复制
Params += argv[i] + ' ';

这将将32添加到指针argv[i],这不是您想要的。您可以将其分为两行:

代码语言:javascript
复制
Params += argv[i];
Params += ' ';

或使用:

代码语言:javascript
复制
Params += string(argv[i]) + ' ';

您还可能希望在每个参数周围添加引号,以防它包含空格。

我还将fMask设置为SEE_MASK_NOASYNC,因为MSDN声明:

在调用

后立即退出的ShellExecuteEx应用程序应该指定此标志.

票数 3
EN

Stack Overflow用户

发布于 2010-03-15 17:44:05

问题是这条线:

代码语言:javascript
复制
Params += argv[i] + ' '

因为argv[i]的类型是char *,将32添加到argv[i],所以会给出一个指向随机内存中间的指针。

我要把它改写为:

代码语言:javascript
复制
Params += std::string(argv[i]) + ' ';

或者,如果您想做得很好,您可以修改它,只在需要的时候添加一个空格:

代码语言:javascript
复制
for ( int i = 2; i < argc; ++i )
{
    if (!Params.empty())
        Params += ' ';
    Params += argv[i];
}
票数 1
EN

Stack Overflow用户

发布于 2010-03-15 17:52:49

我认为问题在于如何为下一个调用创建命令行参数:

代码语言:javascript
复制
 Params += argv[i] + ' ';

不像预期的那样工作。试一试以下几点:

代码语言:javascript
复制
#include <windows.h>
#include <fstream>
#include <iostream>
#include <tchar.h>
using namespace std;

#ifdef _UNICODE
    typedef std::wstring tstring;
#else
    typedef std::string tstring;
#endif

int _tmain(int argc, TCHAR *argv[])
{
    {
        std::ofstream f("C:\\output.txt", std::ios::app);
        f << "app called" << std::endl;
    }
    SHELLEXECUTEINFO shExecInfo;

    shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

    shExecInfo.fMask = NULL;
    shExecInfo.hwnd = NULL;
    shExecInfo.lpVerb = _T("open");
    shExecInfo.lpFile = argv[1];

    tstring Params(_T(""));
    for ( int i = 2; i < argc; ++i )
    {
        Params += argv[i]; 
        Params += _T(' ');
    }

    shExecInfo.lpParameters = Params.c_str();

    shExecInfo.lpDirectory = NULL;
    shExecInfo.nShow = SW_SHOWNORMAL;
    shExecInfo.hInstApp = NULL;

    ShellExecuteEx(&shExecInfo);

    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2448802

复制
相关文章

相似问题

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