`CommandLineToArgvW` получает неверный argv

#c #windows #winapi #command-line

Вопрос:

Как указано в https://daviddeley.com/autohotkey/parameters/parameters.htm#WINCRULESDOC, правила синтаксического анализа были повешены с 2008 года, но CommandLineToArgvW сохраняют устаревшее правило. Я скомпилировал этот код в Visual Studio 2019

 #define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
#define _SILENCE_CXX20_CODECVT_FACETS_DEPRECATION_WARNING
#pragma warning(disable: 4996)
#include <iostream>
#include <memory>
#include <functional>
#include <string_view>
#include <windows.h>
#include <codecvt>
#include <cstddef>
#include <cassert>
#include <fcntl.h>
#include <io.h>
using namespace std;

int main(int argc, char* argv[], char* envp[])
{
    SetConsoleCP(CP_UTF8);
    SetConsoleOutputCP(CP_UTF8);
    
    // ## Command-Line arguments ##
    for (int i = 0; i < argc;   i)
    {
        cout << "argv[" << i << "] = " << argv[i] << endl;
    }
    cout << string(12, '#') << 'n';


    int arg_count;
    auto deleter = [](wchar_t* ptr[]) { LocalFree(ptr); };
    auto command_line = ::GetCommandLineW();
    unique_ptr<wchar_t* [], decltype(deleter)> args{ ::CommandLineToArgvW(command_line, amp;arg_count) };

    wstring_convert<codecvt_utf8<wchar_t>> convert;
    cout << "GetCommandLineW() = " << convert.to_bytes(command_line) << endl;
    cout << "Parsed by `CommandLineToArgvW`:n";
    for (int i = 0; i < arg_count;   i)
        cout << "argv[" << i << "] = " << convert.to_bytes(args[i]) << endl;
    cout << string(9, '*') << endl;
    return 0;
}
 

и получил этот вывод

 cmd>"Command-Line Arguments.exe" "a b"" c
argv[0] = Command-Line Arguments.exe
argv[1] = a b" c
############
GetCommandLineW() = "Command-Line Arguments.exe"  "a b"" c
Parsed by `CommandLineToArgvW`:
argv[0] = Command-Line Arguments.exe
argv[1] = a b"
argv[2] = c
*********
 

Существует ли какой-либо новый api, подобный CommandLineToArgvEx тому, который соответствует действующим правилам синтаксического анализа?

Комментарии:

1. CommandLineToArgvW это winapi и не зависит от версии VS. не существует другой версии Ex . однако в своем приложении вы можете создать свой собственный формат строки cmd и проанализировать его самостоятельно