C++ CreateProcess赢得';t使用参数启动进程

C++ CreateProcess赢得';t使用参数启动进程,c++,windows,winapi,createprocess,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);

因此,我使用以下代码来启动带有参数的控制台应用程序:

#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;
}
#包括
#包括
使用名称空间std;
void StartProgram(字符argv[])
{
STARTUPINFO si;
处理信息;
零内存(&si,sizeof(si));
si.cb=sizeof(si);
零内存(&pi,sizeof(pi));
创建进程
(
文本(“PlayerDebug.exe”),
(LPSTR)argv,
空,空,假,
创建新流程组创建否窗口,
空,空,,
&si和pi
);
};
int main()
{
启动程序(“sound.wav”);
返回0;
}

“PlayerDebug.exe”显示用于调用它的参数。但是,当我以我显示的方式使用CreateProcess运行它时,它不会显示任何内容。我检查了任务管理器,它似乎出现了,但仍然没有显示参数。我还尝试编写
coutCreateProcess的第二个参数是完整的命令行,而不仅仅是EXE的参数。让我们举两个例子:

CreateProcess ("c:\\notepad.exe",
               "c:\\notepad.exe c:\\wibble.txt",
               ...);
将正常工作(如果C:的根目录中有notepad.exe的副本和名为wibble.txt的文件),而

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


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

注意,第二个参数必须是可写内存(如果调用Unicode版本),传递字符串文字是不安全的。这里的字符类型有点混乱。使用
文本
就像您可能遇到ANSI或Unicode文本一样。但接下来是对LPSTR的下流演员。如果没有强制转换,代码将无法编译,这一事实应该会提醒您一个问题。您的演员阵容没有使
argv
实际成为
LPSTR
CreateProcess ("c:\\notepad.exe",
               "c:\\wibble.txt",
               ...);