#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 и проанализировать его самостоятельно