summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-05-09 16:37:27 +0200
committerCarl Hetherington <cth@carlh.net>2022-05-11 20:38:01 +0200
commitbbe336ee97c86c424f8f94e0f947f8e3b20e7123 (patch)
tree8e150d92ce7b7f151618aec8cc056d2df01dc5fc /src/lib
parent2695f450ca00654cef8709e4e3cfb4cf5de48fc7 (diff)
Use GetCommandLineW() to get a UTF16-encoded command line on Windows (#2248).
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/cross.h23
-rw-r--r--src/lib/cross_unix.cc7
-rw-r--r--src/lib/cross_windows.cc21
3 files changed, 48 insertions, 3 deletions
diff --git a/src/lib/cross.h b/src/lib/cross.h
index b79f7ebdf..4be121d2b 100644
--- a/src/lib/cross.h
+++ b/src/lib/cross.h
@@ -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
diff --git a/src/lib/cross_unix.cc b/src/lib/cross_unix.cc
index 7501a4c08..743c11980 100644
--- a/src/lib/cross_unix.cc
+++ b/src/lib/cross_unix.cc
@@ -84,3 +84,10 @@ dcpomatic::get_process_id ()
}
+ArgFixer::ArgFixer(int argc, char** argv)
+ : _argc(argc)
+ , _argv(argv)
+{
+
+}
+
diff --git a/src/lib/cross_windows.cc b/src/lib/cross_windows.cc
index 054961578..200b72485 100644
--- a/src/lib/cross_windows.cc
+++ b/src/lib/cross_windows.cc
@@ -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());
+ }
+}
+