CreateProcess不会使用参数启动proccess

Bat*_*Guy 0 c++ windows winapi createprocess

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

Bob*_*ore 6

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

CreateProcess ("c:\\notepad.exe",
               "c:\\notepad.exe c:\\wibble.txt",
               ...);
Run Code Online (Sandbox Code Playgroud)

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

CreateProcess ("c:\\notepad.exe",
               "c:\\wibble.txt",
               ...);
Run Code Online (Sandbox Code Playgroud)

将启动EXE但无法打开该文件.这意味着当帮助系统调用命令行的第二个参数时,它不是在说谎 - 它需要整个命令行.

请注意,如果整个命令行位于第二个参数中,则可以使用NULL作为第一个参数.这就是我通常使用它的方式.

  • 请注意,第二个参数必须是可写内存(如果调用Unicode版本),传递字符串文字是不安全的. (4认同)