如何将argv转换为CreateProcess的lpCommandLine参数?

Ste*_*lus -4 c c++ windows winapi createprocess

我想编写一个启动另一个应用程序的应用程序.像这样:

# This will launch another_app.exe
my_app.exe another_app.exe 
# This will launch another_app.exe with arg1, arg and arg3 arguments
my_app.exe another_app.exe arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

这里的问题是我正在进入char* argv[]我的main函数,但我需要将它合并到LPTSTR以便将其传递给CreateProcess.

有一个GetCommandLine函数,但我不能使用它,因为我从Linux移植代码并绑定argc/argv(否则,这对我来说是一个非常难看的黑客).

我不能轻易地手动合并参数,因为argv[i]可能包含空格.

基本上,我想反过来CommandLineToArgvW.有没有标准的方法来做到这一点?

Rem*_*eau 6

没有与CommandLineToArgvW(). 您必须自己格式化命令行字符串。这只不过是基本的字符串连接。

Microsoft 记录了命令行参数的格式(或者至少是 VC++ 编写的应用程序所期望的格式):

解析 C++ 命令行参数

Microsoft C/C++ 启动代码在解释操作系统命令行上给出的参数时使用以下规则:

  • 参数由空格分隔,空格或制表符。

  • 插入字符 (^) 不被识别为转义字符或分隔符。在传递给程序中的 argv 数组之前,该字符完全由操作系统中的命令行解析器处理。

  • 由双引号 ("string") 包围的字符串被解释为单个参数,而不管其中包含的空格。带引号的字符串可以嵌入到参数中。

  • 以反斜杠 (\") 开头的双引号被解释为文字双引号字符 (")。

  • 反斜杠按字面解释,除非它们紧跟在双引号之前。

  • 如果偶数个反斜杠后跟一个双引号,则在 argv 数组中为每对反斜杠放置一个反斜杠,并将双引号解释为字符串分隔符。

  • 如果奇数个反斜杠后跟双引号,则每对反斜杠都会在argv数组中放置一个反斜杠,双引号被剩余的反斜杠“转义”,导致字面双引号(“ ) 放置在 argv 中。

编写一个接受字符串数组并将它们连接在一起的函数,对数组中的每个字符串应用与上述规则相反的规则,对您来说应该不难。


Mar*_*ica 6

关于如何引用争论的最终答案在Daniel Colascione的博客上:

https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/

我不愿在这里引用代码,因为我不知道许可证.基本思路是:

for each single argument:
    if it does not contain  \t\n\v\", 
        just use as is
    else
        output "
        for each character
            backslashes = 0
            if character is backslash
                count how many successive backslashes there are
            fi
            if eow
                output the backslashs doubled
                break
            else if char is "
                output the backslashs doubled
                output \"
            else
                output the backslashes (*not* doubled)
                output character
            fi
        rof
        output "
    fi // needs quoting
rof // each argument
Run Code Online (Sandbox Code Playgroud)

如果需要将命令行传递给cmd.exe,请参阅文章(它不同).

我认为Microsoft C运行时库没有执行此操作的功能,这很疯狂.