Windows: Fix passing Unicode filenames (fixes #1359)

This commit is contained in:
Vicki Pfau 2019-03-16 19:37:42 -07:00
parent 1844c26388
commit c364a6527a
4 changed files with 43 additions and 1 deletions

View File

@ -226,6 +226,8 @@ endif()
if(WIN32)
set(WIN32_VERSION "${LIB_VERSION_MAJOR},${LIB_VERSION_MINOR},${LIB_VERSION_PATCH}")
add_definitions(-D_WIN32_WINNT=0x0600)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -municode")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -municode")
list(APPEND OS_LIB ws2_32 shlwapi)
list(APPEND CORE_VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-fd.c ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/windows/vfs-w32.c)
file(GLOB OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/windows/*.c)

View File

@ -34,12 +34,16 @@ CXX_GUARD_START
// WinSock2 gets very angry if it's included too late
#include <winsock2.h>
#endif
#if defined(_MSC_VER) || defined(__cplusplus)
#define restrict __restrict
#endif
#ifdef _MSC_VER
#include <Windows.h>
#include <sys/types.h>
typedef intptr_t ssize_t;
#define PATH_MAX MAX_PATH
#define restrict __restrict
#define strcasecmp _stricmp
#define strncasecmp _strnicmp
#define ftruncate _chsize

View File

@ -104,3 +104,21 @@ int main(int argc, char* argv[]) {
return application.exec();
}
#ifdef _WIN32
#include <mgba-util/string.h>
#include <vector>
extern "C"
int wmain(int argc, wchar_t* argv[]) {
std::vector<char*> argv8;
for (int i = 0; i < argc; ++i) {
argv8.push_back(utf16to8(reinterpret_cast<uint16_t*>(argv[i]), wcslen(argv[i]) * 2));
}
int ret = main(argc, argv8.data());
for (char* ptr : argv8) {
free(ptr);
}
return ret;
}
#endif

View File

@ -179,6 +179,24 @@ int main(int argc, char** argv) {
return ret;
}
#ifdef _WIN32
#include <mgba-util/string.h>
int wmain(int argc, wchar_t** argv) {
char** argv8 = malloc(sizeof(char*) * argc);
int i;
for (i = 0; i < argc; ++i) {
argv8[i] = utf16to8((uint16_t*) argv[i], wcslen(argv[i]) * 2);
}
int ret = main(argc, argv8);
for (i = 0; i < argc; ++i) {
free(argv8[i]);
}
free(argv8);
return ret;
}
#endif
int mSDLRun(struct mSDLRenderer* renderer, struct mArguments* args) {
struct mCoreThread thread = {
.core = renderer->core