Skip to content

Commit

Permalink
Support wchar_t in argv for Windows
Browse files Browse the repository at this point in the history
PR #3547 <#3547>
Fixes #2932 <#2932>

Signed-off-by: Yu-Chen Lin <[email protected]>
Signed-off-by: Romain Vimont <[email protected]>
  • Loading branch information
npes87184 authored and rom1v committed Oct 23, 2022
1 parent d71587e commit 48bb6f2
Showing 1 changed file with 55 additions and 2 deletions.
57 changes: 55 additions & 2 deletions app/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
#include <stdbool.h>
#include <unistd.h>
#include <libavformat/avformat.h>
#ifdef _WIN32
#include <windows.h>
#include "util/str.h"
#endif
#ifdef HAVE_V4L2
# include <libavdevice/avdevice.h>
#endif
Expand All @@ -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);
Expand Down Expand Up @@ -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
}

0 comments on commit 48bb6f2

Please sign in to comment.