diff --git a/melonDS.cbp b/melonDS.cbp
index d0485d6b..7e83b989 100644
--- a/melonDS.cbp
+++ b/melonDS.cbp
@@ -229,6 +229,7 @@
+
diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp
index 3d480f39..03f536a6 100644
--- a/src/NDSCart.cpp
+++ b/src/NDSCart.cpp
@@ -22,6 +22,8 @@
#include "NDSCart.h"
#include "ARM.h"
+#include "melon_fopen.h"
+
namespace NDSCart_SRAM
{
@@ -92,7 +94,7 @@ void LoadSave(char* path)
strncpy(SRAMPath, path, 255);
SRAMPath[255] = '\0';
- FILE* f = fopen(path, "rb");
+ FILE* f = melon_fopen(path, "rb");
if (f)
{
fseek(f, 0, SEEK_END);
@@ -624,7 +626,7 @@ void Write(u8 val, u32 hold)
if (islast && (CurCmd == 0x02 || CurCmd == 0x0A) && (SRAMLength > 0))
{
- FILE* f = fopen(SRAMPath, "wb");
+ FILE* f = melon_fopen(SRAMPath, "wb");
if (f)
{
fwrite(SRAM, SRAMLength, 1, f);
@@ -817,7 +819,7 @@ bool LoadROM(const char* path, bool direct)
// TODO: streaming mode? for really big ROMs or systems with limited RAM
// for now we're lazy
- FILE* f = fopen(path, "rb");
+ FILE* f = melon_fopen(path, "rb");
if (!f)
{
return false;
diff --git a/src/melon_fopen.h b/src/melon_fopen.h
new file mode 100644
index 00000000..2541f84f
--- /dev/null
+++ b/src/melon_fopen.h
@@ -0,0 +1,50 @@
+/*
+ Copyright 2016-2017 StapleButter
+
+ This file is part of melonDS.
+
+ melonDS is free software: you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or (at your option)
+ any later version.
+
+ melonDS is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with melonDS. If not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef MELON_FOPEN_H
+#define MELON_FOPEN_H
+
+#ifdef __WIN32__
+
+#include
+
+static FILE* melon_fopen(const char* path, const char* mode)
+{
+ int len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0);
+ if (len < 1) return NULL;
+ WCHAR* fatass = new WCHAR[len];
+ int res = MultiByteToWideChar(CP_UTF8, 0, path, -1, fatass, len);
+ if (res != len) return NULL; // checkme?
+
+ // this will be more than enough
+ WCHAR fatmode[4];
+ fatmode[0] = mode[0];
+ fatmode[1] = mode[1];
+ fatmode[2] = mode[2];
+ fatmode[3] = 0;
+
+ return _wfopen(fatass, fatmode);
+}
+
+#else
+
+#define melon_fopen fopen
+
+#endif
+
+#endif // MELON_FOPEN_H