Use wsetargv.obj, and wmain() rather than main(), on Windows.
authorGuy Harris <guy@alum.mit.edu>
Sun, 7 Oct 2018 17:06:00 +0000 (10:06 -0700)
committerGuy Harris <guy@alum.mit.edu>
Sun, 7 Oct 2018 18:57:54 +0000 (18:57 +0000)
commita679ae6f791ac6b02f342d3b73d6b4aecb9ca6e9
treed2f21c87ea7422fa56ba8cc2ff6f23d18bea36f2
parentce53b4c170e0b0b1c7bb521fe677db1eadc7792b
Use wsetargv.obj, and wmain() rather than main(), on Windows.

Doing so for command-line programs means that the argument list doesn't
ever get converted to the local code page; converting to the local code
page can mangle file names that *can't* be converted to the local code
page.

Furthermore, code that uses setargv.obj rather than wsetargv.obj has
issues in some versions of Windows 10; see bug 15151.

That means that converting the argument list to UTF-8 is a bit simpler -
we don't need to call GetCommandLineW() or CommandLineToArgvW(), we just
loop over the UTF-16LE argument strings in argv[].

While we're at it, note in Wireshark's main() why we discard argv on
Windows (Qt does the same "convert-to-the-local-code-page" stuff); that
means we *do* need to call GetCommandLineW() and CommandLineToArgvW() in
main() (i.e., we duplicate what Qt's WinMain() does, but converting to
UTF-8 rather than to the local code page).

Change-Id: I35b57c1b658fb3e9b0c685097afe324e9fe98649
Ping-Bug: 15151
Reviewed-on: https://code.wireshark.org/review/30051
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot
Reviewed-by: Guy Harris <guy@alum.mit.edu>
14 files changed:
CMakeLists.txt
capinfos.c
captype.c
dumpcap.c
editcap.c
mergecap.c
randpkt.c
rawshark.c
text2pcap.c
tfshark.c
tshark.c
ui/qt/main.cpp
wsutil/unicode-utils.c
wsutil/unicode-utils.h