diff --git a/CMakeLists.txt b/CMakeLists.txt index 1421f05f2..5f68e5421 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -270,6 +270,11 @@ add_library(StormLib STATIC 3rdParty/StormLib/src/SFileOpenFileEx.cpp 3rdParty/StormLib/src/SFileReadFile.cpp) +if(WIN32) +# Enable Unicode for StormLib wchar_t* file APIs +target_compile_definitions(StormLib PRIVATE -DUNICODE -D_UNICODE) +endif() + add_library(PKWare STATIC 3rdParty/PKWare/explode.cpp 3rdParty/PKWare/implode.cpp) diff --git a/Source/storm/storm.h b/Source/storm/storm.h index eabb56b20..a397b4160 100644 --- a/Source/storm/storm.h +++ b/Source/storm/storm.h @@ -244,7 +244,11 @@ bool SNetSendTurn(char *data, unsigned int databytes); bool SFileOpenFile(const char *filename, HANDLE *phFile); // Functions implemented in StormLib +#if defined(_WIN64) || defined(_WIN32) +bool WINAPI SFileOpenArchive(const wchar_t *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq); +#else bool WINAPI SFileOpenArchive(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq); +#endif bool WINAPI SFileCloseArchive(HANDLE hArchive); bool WINAPI SFileOpenFileEx(HANDLE hMpq, const char *szFileName, DWORD dwSearchScope, HANDLE *phFile); bool WINAPI SFileReadFile(HANDLE hFile, void *buffer, DWORD nNumberOfBytesToRead, DWORD *read, int *lpDistanceToMoveHigh); diff --git a/Source/utils/file_util.cpp b/Source/utils/file_util.cpp index 80739102e..7151651c8 100644 --- a/Source/utils/file_util.cpp +++ b/Source/utils/file_util.cpp @@ -174,7 +174,16 @@ std::unique_ptr CreateFileStream(const char *path, std::ios::openm bool SFileOpenArchiveDiablo(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq) { +#if defined(_WIN64) || defined(_WIN32) + const auto szMpqNameUtf16 = ToWideChar(szMpqName); + if (szMpqNameUtf16 == nullptr) { + LogError("UTF-8 -> UTF-16 conversion error code {}", ::GetLastError()); + return false; + } + return SFileOpenArchive(szMpqNameUtf16.get(), dwPriority, dwFlags, phMpq); +#else return SFileOpenArchive(szMpqName, dwPriority, dwFlags, phMpq); +#endif } } // namespace devilution