From 48bb6f2ea858a02e05900d9828c0089166de17df Mon Sep 17 00:00:00 2001 From: Yu-Chen Lin Date: Sun, 23 Oct 2022 14:15:25 +0800 Subject: [PATCH] Support wchar_t in argv for Windows PR #3547 Fixes #2932 Signed-off-by: Yu-Chen Lin Signed-off-by: Romain Vimont --- app/src/main.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/app/src/main.c b/app/src/main.c index 3334cbf9..b3a468cc 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -4,6 +4,10 @@ #include #include #include +#ifdef _WIN32 +#include +#include "util/str.h" +#endif #ifdef HAVE_V4L2 # include #endif @@ -18,8 +22,8 @@ #include "version.h" int -main(int argc, char *argv[]) { -#ifdef __WINDOWS__ +main_scrcpy(int argc, char *argv[]) { +#ifdef _WIN32 // disable buffering, we want logs immediately // even line buffering (setvbuf() with mode _IOLBF) is not sufficient setbuf(stdout, NULL); @@ -80,3 +84,52 @@ main(int argc, char *argv[]) { return ret; } + +int +main(int argc, char *argv[]) { +#ifndef _WIN32 + return main_scrcpy(argc, argv); +#else + (void) argc; + (void) argv; + int wargc; + wchar_t **wargv = CommandLineToArgvW(GetCommandLineW(), &wargc); + if (!wargv) { + LOG_OOM(); + return SCRCPY_EXIT_FAILURE; + } + + char **argv_utf8 = malloc((wargc + 1) * sizeof(*argv_utf8)); + if (!argv_utf8) { + LOG_OOM(); + LocalFree(wargv); + return SCRCPY_EXIT_FAILURE; + } + + argv_utf8[wargc] = NULL; + + for (int i = 0; i < wargc; ++i) { + argv_utf8[i] = sc_str_from_wchars(wargv[i]); + if (!argv_utf8[i]) { + LOG_OOM(); + for (int j = 0; j < i; ++j) { + free(argv_utf8[j]); + } + LocalFree(wargv); + free(argv_utf8); + return SCRCPY_EXIT_FAILURE; + } + } + + LocalFree(wargv); + + int ret = main_scrcpy(wargc, argv_utf8); + + for (int i = 0; i < wargc; ++i) { + free(argv_utf8[i]); + } + free(argv_utf8); + + return ret; +#endif +}