CreateProcess 不会使用参数启动进程

Posted

技术标签:

【中文标题】CreateProcess 不会使用参数启动进程【英文标题】:CreateProcess won't start the proccess with arguments 【发布时间】:2016-01-28 19:52:51 【问题描述】:

所以我使用这段代码来启动一个带参数的控制台应用程序:

#include <iostream>
#include <windows.h>

using namespace std;

void StartProgram(char argv[])

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    CreateProcess
    (
        TEXT("PlayerDebug.exe"),
        (LPSTR)argv,
        NULL,NULL,FALSE,
        CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
        NULL,NULL,
        &si, &pi
    );
;

int main()

    StartProgram("sound.wav");
    return 0;

“PlayerDebug.exe”显示用于调用它的参数。但是当我按照我展示的方式使用 CreateProcess 运行它时,它不会显示任何内容。我检查并在任务管理器中似乎出现了,但仍然没有显示参数。我还尝试在函数void StartProgram(char argv[]) 中写cout &lt;&lt; argv;,它返回“sound.wav”,这是正确的。但似乎参数没有传递给 PlayerDebug.exe,我不知道为什么。 我做错了什么? (我是 C++ 编程新手)

【问题讨论】:

这里的字符类型有点乱。使用TEXT,就好像您可能会遇到 ANSI 或 Unicode 文本一样。但随后对LPSTR 进行了令人讨厌的演员阵容。没有强制转换代码将无法编译的事实应该提醒您注意一个问题。您的演员表不会使 argv 实际上是 LPSTR 【参考方案1】:

CreateProcess 的第二个参数是完整的命令行,而不仅仅是 EXE 的参数。让我们举两个例子:

CreateProcess ("c:\\notepad.exe",
               "c:\\notepad.exe c:\\wibble.txt",
               ...);

可以正常工作(如果在 C: 的根目录中有 notepad.exe 的副本和名为 wibble.txt 的文件),而

CreateProcess ("c:\\notepad.exe",
               "c:\\wibble.txt",
               ...);

将启动 EXE 但无法打开文件。这意味着当帮助系统调用命令行的第二个参数时,它没有撒谎——它需要整个命令行。

请注意,如果整个命令行都在第二个参数中,您可以使用 NULL 作为第一个参数。其实我平时就是这么用的。

【讨论】:

注意第二个参数必须是可写内存(如果调用Unicode版本),传递字符串字面量是不安全的。

以上是关于CreateProcess 不会使用参数启动进程的主要内容,如果未能解决你的问题,请参考以下文章

Windows 7 CreateProcess,子进程无法写入文件?

使用 CreateProcess 启动子程序时,不会在父程序的工作目录中搜索 DLL

在 Windows CE 中使用 CreateProcess 启动的应用程序不会作为应用程序显示在任务管理器中

c ++ createprocess - 命令行参数的字符串var - 没有发生任何事情

CreateProcess的前两个参数究竟怎么用

获取进程启动时间