From 258a6628e405634745aa6736fd1146071e7b9131 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sun, 30 May 2021 02:25:31 +0800 Subject: [PATCH] fix: Cannot start application when code page is 65001. Closes #814. This commit may cause breaking change: changing working directory to the directory where the executable locates in. --- .../src/main/resources/assets/HMCLauncher.exe | Bin 95232 -> 96768 bytes HMCLauncher/.clang-format | 2 ++ HMCLauncher/HMCL/HMCL.vcxproj | 2 +- HMCLauncher/HMCL/main.cpp | 27 +++++++++++------- HMCLauncher/HMCL/os.cpp | 9 ++++-- HMCLauncher/HMCL/os.h | 2 +- 6 files changed, 28 insertions(+), 14 deletions(-) create mode 100644 HMCLauncher/.clang-format diff --git a/HMCL/src/main/resources/assets/HMCLauncher.exe b/HMCL/src/main/resources/assets/HMCLauncher.exe index 11eab6b26bc3dc099bdd1bb4a9627a587f2ea0af..a233150dd6fc2b087ce1192c60c7fd8003edd53b 100644 GIT binary patch delta 22438 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 false true - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS false MultiThreaded Disabled diff --git a/HMCLauncher/HMCL/main.cpp b/HMCLauncher/HMCL/main.cpp index c51747685..47b29e104 100644 --- a/HMCLauncher/HMCL/main.cpp +++ b/HMCLauncher/HMCL/main.cpp @@ -8,13 +8,13 @@ using namespace std; Version J8(TEXT("8")); -void RawLaunchJVM(const wstring &javaPath, const wstring &jarPath) +void RawLaunchJVM(const wstring &javaPath, const wstring& workdir, const wstring &jarPath) { - if (MyCreateProcess(L"\"" + javaPath + L"\" -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15 -jar \"" + jarPath + L"\"")) + if (MyCreateProcess(L"\"" + javaPath + L"\" -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15 -jar \"" + jarPath + L"\"", workdir)) exit(EXIT_SUCCESS); } -void LaunchJVM(const wstring &javaPath, const wstring &jarPath) +void LaunchJVM(const wstring &javaPath, const wstring& workdir, const wstring &jarPath) { Version javaVersion(L""); if (!MyGetFileVersionInfo(javaPath, javaVersion)) @@ -22,7 +22,7 @@ void LaunchJVM(const wstring &javaPath, const wstring &jarPath) if (J8 <= javaVersion) { - RawLaunchJVM(javaPath, jarPath); + RawLaunchJVM(javaPath, workdir, jarPath); } } @@ -34,6 +34,13 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd if (ERROR_SUCCESS != MyGetModuleFileName(NULL, exeName)) return 1; + wstring workdir; + size_t last_slash = exeName.find_last_of(L"/\\"); + if (last_slash != wstring::npos && last_slash + 1 < exeName.size()) { + workdir = exeName.substr(0, last_slash); + exeName = exeName.substr(last_slash + 1); + } + // TODO: check whether the bundled JRE is valid. // First try the Java packaged together. bool is64Bit = false; @@ -41,15 +48,15 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd if (is64Bit) { - RawLaunchJVM(L"jre-x64\\bin\\javaw.exe", exeName); + RawLaunchJVM(L"jre-x64\\bin\\javaw.exe", workdir, exeName); } else { - RawLaunchJVM(L"jre-x86\\bin\\javaw.exe", exeName); + RawLaunchJVM(L"jre-x86\\bin\\javaw.exe", workdir, exeName); } if (FindJava(path)) - LaunchJVM(path + L"\\bin\\javaw.exe", exeName); + LaunchJVM(path + L"\\bin\\javaw.exe", workdir, exeName); // Or we try to search Java in C:\Program Files. { @@ -60,7 +67,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd do { wstring javaw = wstring(L"C:\\Program Files\\Java\\") + data.cFileName + wstring(L"\\bin\\javaw.exe"); if (FindFirstFileExists(javaw.c_str(), 0)) { - LaunchJVM(javaw, exeName); + LaunchJVM(javaw, workdir, exeName); } } while (FindNextFile(hFind, &data)); FindClose(hFind); @@ -76,7 +83,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd do { wstring javaw = wstring(L"C:\\Program Files (x86)\\Java\\") + data.cFileName + L"\\bin\\javaw.exe"; if (FindFirstFileExists(javaw.c_str(), 0)) { - LaunchJVM(javaw, exeName); + LaunchJVM(javaw, workdir, exeName); } } while (FindNextFile(hFind, &data)); FindClose(hFind); @@ -84,7 +91,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd } // Try java in PATH - RawLaunchJVM(L"javaw", exeName); + RawLaunchJVM(L"javaw", workdir, exeName); MessageBox(NULL, ERROR_PROMPT, L"Error", MB_ICONERROR | MB_OK); ShellExecute(0, 0, L"https://java.com/", 0, 0, SW_SHOW); diff --git a/HMCLauncher/HMCL/os.cpp b/HMCLauncher/HMCL/os.cpp index 17c0c3bc9..9b640e653 100644 --- a/HMCLauncher/HMCL/os.cpp +++ b/HMCLauncher/HMCL/os.cpp @@ -52,7 +52,7 @@ LSTATUS MyGetEnvironmentVariable(LPCWSTR name, std::wstring & out) } } -bool MyCreateProcess(const std::wstring &command) +bool MyCreateProcess(const std::wstring &command, const std::wstring &workdir) { wstring writable_command = command; STARTUPINFO si; @@ -61,7 +61,12 @@ bool MyCreateProcess(const std::wstring &command) ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); - return (CreateProcess(NULL, &writable_command[0], NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)); + if (workdir.empty()) { + return CreateProcess(NULL, &writable_command[0], NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); + } + else { + return CreateProcess(NULL, &writable_command[0], NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, workdir.c_str(), &si, &pi); + } } bool FindFirstFileExists(LPCWSTR lpPath, DWORD dwFilter) diff --git a/HMCLauncher/HMCL/os.h b/HMCLauncher/HMCL/os.h index e3207899d..ab2f69ff8 100644 --- a/HMCLauncher/HMCL/os.h +++ b/HMCLauncher/HMCL/os.h @@ -16,7 +16,7 @@ LSTATUS MyGetModuleFileName(HMODULE hModule, std::wstring &out); LSTATUS MyGetEnvironmentVariable(LPCWSTR name, std::wstring &out); // Create process by invoking CreateProcess, only pass command. -bool MyCreateProcess(const std::wstring &command); +bool MyCreateProcess(const std::wstring &command, const std::wstring& workdir); // Check if file lpPath exists. bool FindFirstFileExists(LPCWSTR lpPath, DWORD dwFilter);