createProcess()中的argv与普通c++程序不同的原因

why argv in createProcess() is different from normal c++ program

本文关键字:程序 c++ 中的 argv createProcess      更新时间:2023-10-16

这是我的代码,我发现第一个输出是"thisProgram.exe"第二个输出是"a"。

为什么?

我读了msdn中的文档,但我不太清楚为什么argv[0]可以是"a",在使用createProcess时,windows中是否有不同之处。有人能告诉我lpApplicationName和lpCommandline的区别吗?感谢

int main( int argc, char *argv[] ) {
cout << argv[0] << endl;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// Start the child process.
if (!CreateProcess("thisProgram.exe",   // No module name (use command line)
                   "a b c",        // Command line
                   NULL,           // Process handle not inheritable
                   NULL,           // Thread handle not inheritable
                   FALSE,          // Set handle inheritance to FALSE
                   0,              // No creation flags
                   NULL,           // Use parent's environment block
                   NULL,           // Use parent's starting directory
                   &si,            // Pointer to STARTUPINFO structure
                   &pi)           // Pointer to PROCESS_INFORMATION structure
        ) {
    printf("CreateProcess failed (%d).n", GetLastError());
    return 1;
}
// Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;

}

CreateProcess将第二个参数(命令行)作为命令行传递给新进程。CreateProcess不会在模块名称前加上前缀。如果希望应用程序名称显示为argv[0],则必须在命令行参数中重复应用程序名称。

文件上是这样写的:

如果lpApplicationName和lpCommandLine都不是NULL,则lpApplicationName指向的以NULL结尾的字符串指定要执行的模块,而lpCommandLine指向的以NULL结尾的字符串则指定命令行。新进程可以使用GetCommandLine来检索整个命令行。用C编写的控制台进程可以使用argc和argv参数来解析命令行。由于argv[0]是模块名称,C程序员通常会将模块名称作为命令行中的第一个标记重复使用。

通常最简单的方法是为应用程序名称传递NULL,为命令行传递连接在一起的应用程序名称和参数。