|  | // Copyright 2013 The Flutter Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "flutter/fml/command_line.h" | 
|  |  | 
|  | #include <windows.h> | 
|  |  | 
|  | #include <Shellapi.h> | 
|  | #include <memory> | 
|  |  | 
|  | namespace fml { | 
|  |  | 
|  | std::optional<CommandLine> CommandLineFromPlatform() { | 
|  | wchar_t* command_line = GetCommandLineW(); | 
|  | int unicode_argc; | 
|  | std::unique_ptr<wchar_t*[], decltype(::LocalFree)*> unicode_argv( | 
|  | CommandLineToArgvW(command_line, &unicode_argc), ::LocalFree); | 
|  | if (!unicode_argv) { | 
|  | return std::nullopt; | 
|  | } | 
|  | std::vector<std::string> utf8_argv; | 
|  | for (int i = 0; i < unicode_argc; ++i) { | 
|  | wchar_t* arg = unicode_argv[i]; | 
|  | int arg_len = WideCharToMultiByte(CP_UTF8, 0, arg, wcslen(arg), nullptr, 0, | 
|  | nullptr, nullptr); | 
|  | std::string utf8_arg(arg_len, 0); | 
|  | WideCharToMultiByte(CP_UTF8, 0, arg, -1, utf8_arg.data(), utf8_arg.size(), | 
|  | nullptr, nullptr); | 
|  | utf8_argv.push_back(std::move(utf8_arg)); | 
|  | } | 
|  | return CommandLineFromIterators(utf8_argv.begin(), utf8_argv.end()); | 
|  | } | 
|  |  | 
|  | }  // namespace fml |