Use GetCommandLineW() to get a UTF16-encoded command line on Windows (#2248).
authorCarl Hetherington <cth@carlh.net>
Mon, 9 May 2022 14:37:27 +0000 (16:37 +0200)
committerCarl Hetherington <cth@carlh.net>
Wed, 11 May 2022 18:38:01 +0000 (20:38 +0200)
src/lib/cross.h
src/lib/cross_unix.cc
src/lib/cross_windows.cc
src/tools/dcpomatic_kdm_cli.cc

index b79f7ebdf6953071bef4df028470a4010e047d8a..4be121d2bb1daec1e46451366e26621ecef7ca63 100644 (file)
@@ -159,4 +159,27 @@ boost::optional<OSXMediaPath> analyse_osx_media_path (std::string path);
 std::vector<Drive> osx_disks_to_drives (std::vector<OSXDisk> disks);
 
 
+class ArgFixer
+{
+public:
+       ArgFixer(int argc, char** argv);
+
+       int argc() const {
+               return _argc;
+       }
+
+       char** argv() const {
+                return _argv;
+       }
+
+private:
+       int _argc;
+       char** _argv;
+#ifdef DCPOMATIC_WINDOWS
+       std::vector<std::string> _argv_strings;
+#endif
+
+};
+
+
 #endif
index 7501a4c08b9249256187b8479a2eb070d3fa103d..743c11980f7b16c09717a0ac818b43d4b536f79a 100644 (file)
@@ -84,3 +84,10 @@ dcpomatic::get_process_id ()
 }
 
 
+ArgFixer::ArgFixer(int argc, char** argv)
+       : _argc(argc)
+       , _argv(argv)
+{
+
+}
+
index 0549615787214dbd0ce4ef18b31ced6b5df78aca..200b724854731b2582110f752d45abf87921831b 100644 (file)
@@ -44,10 +44,11 @@ extern "C" {
 #include <setupapi.h>
 #include <fileapi.h>
 #undef DATADIR
-#include <shlwapi.h>
-#include <shlobj.h>
-#include <shellapi.h>
 #include <knownfolders.h>
+#include <processenv.h>
+#include <shellapi.h>
+#include <shlobj.h>
+#include <shlwapi.h>
 #include <fcntl.h>
 #include <fstream>
 #include <map>
@@ -657,3 +658,17 @@ show_in_file_manager (boost::filesystem::path, boost::filesystem::path select)
        return (reinterpret_cast<int64_t>(r) <= 32);
 }
 
+
+ArgFixer::ArgFixer(int, char**)
+{
+       auto cmd_line = GetCommandLineW();
+       auto wide_argv = CommandLineToArgvW(cmd_line, &_argc);
+
+       _argv_strings.resize(_argc);
+       _argv = new char*[_argc];
+       for (int i = 0; i < _argc; ++i) {
+               _argv_strings[i] = wchar_to_utf8(wide_argv[i]);
+               _argv[i] = const_cast<char*>(_argv_strings[i].c_str());
+       }
+}
+
index 46ab47a9a4c8d256c4ef9dea22d6038211b3d9da..1db5ce7f93ecf6968f481c7e4849e63a37037455 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 
+#include "lib/cross.h"
 #include "lib/kdm_cli.h"
 #include "lib/util.h"
 #include <iostream>
 int
 main (int argc, char* argv[])
 {
+       ArgFixer fixer(argc, argv);
+
        dcpomatic_setup_path_encoding ();
        dcpomatic_setup ();
 
-       auto error = kdm_cli (argc, argv, [](std::string s) { std::cout << s << "\n"; });
+       auto error = kdm_cli (fixer.argc(), fixer.argv(), [](std::string s) { std::cout << s << "\n"; });
        if (error) {
                std::cerr << *error << "\n";
                exit (EXIT_FAILURE);