File indexing completed on 2026-01-08 10:09:16
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009
0010
0011
0012 #include "../Argv.hpp"
0013
0014 #include "../Encoding.hpp"
0015
0016
0017 #include <algorithm>
0018 #include <memory>
0019 #include <stdexcept>
0020 #include <string>
0021 #include <vector>
0022
0023
0024
0025 #if defined(_WIN32)
0026 #if !(defined(_AMD64_) || defined(_X86_) || defined(_ARM_))
0027 #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || \
0028 defined(_M_AMD64)
0029 #define _AMD64_
0030 #elif defined(i386) || defined(__i386) || defined(__i386__) || defined(__i386__) || defined(_M_IX86)
0031 #define _X86_
0032 #elif defined(__arm__) || defined(_M_ARM) || defined(_M_ARMT)
0033 #define _ARM_
0034 #elif defined(__aarch64__) || defined(_M_ARM64)
0035 #define _ARM64_
0036 #elif defined(_M_ARM64EC)
0037 #define _ARM64EC_
0038 #endif
0039 #endif
0040
0041
0042 #ifndef NOMINMAX
0043
0044 #define NOMINMAX
0045 #include <windef.h>
0046 #undef NOMINMAX
0047 #else
0048 #include <windef.h>
0049 #endif
0050
0051
0052 #include <winbase.h>
0053
0054 #include <processthreadsapi.h>
0055 #include <shellapi.h>
0056 #endif
0057
0058
0059 namespace CLI {
0060
0061
0062 namespace detail {
0063
0064 #ifdef _WIN32
0065 CLI11_INLINE std::vector<std::string> compute_win32_argv() {
0066 std::vector<std::string> result;
0067 int argc = 0;
0068
0069 auto deleter = [](wchar_t **ptr) { LocalFree(ptr); };
0070
0071 auto wargv = std::unique_ptr<wchar_t *[], decltype(deleter)>(CommandLineToArgvW(GetCommandLineW(), &argc), deleter);
0072
0073
0074 if(wargv == nullptr) {
0075 throw std::runtime_error("CommandLineToArgvW failed with code " + std::to_string(GetLastError()));
0076 }
0077
0078 result.reserve(static_cast<size_t>(argc));
0079 for(size_t i = 0; i < static_cast<size_t>(argc); ++i) {
0080 result.push_back(narrow(wargv[i]));
0081 }
0082
0083 return result;
0084 }
0085 #endif
0086
0087 }
0088
0089
0090 }