geode/loader/launcher/windows/Bootstrapper.cpp
matcool a1e9ac46b9
use wide version of winapi functions
This in theory should help with unicode support, as the old cocos2d
methods did not handle unicode well. However i was not able to test this
since vanilla gd itself doesnt launch on a non ascii path for me!
2023-05-01 11:18:35 -03:00

71 lines
1.8 KiB
C++

#include <Windows.h>
#include <iostream>
#include <array>
#include <ghc/filesystem.hpp>
void showError(std::string const& error) {
MessageBoxA(nullptr, error.c_str(), "Error Loading Geode", MB_ICONERROR);
}
int loadGeode(PVOID module) {
if (!LoadLibraryW(L"Geode.dll")) {
auto code = GetLastError();
showError("Unable to load Geode (code " + std::to_string(code) + ")");
return code;
}
FreeLibraryAndExitThread(static_cast<HINSTANCE>(module), 0);
return 0;
}
DWORD WINAPI load(PVOID module) {
std::array<WCHAR, MAX_PATH> szFileName;
GetModuleFileNameW(NULL, szFileName.data(), MAX_PATH);
const ghc::filesystem::path path(szFileName.data());
auto workingDir = path.parent_path();
auto updatesDir = workingDir / "geode" / "update";
auto resourcesDir = workingDir / "geode" / "resources";
auto error = std::error_code();
if (ghc::filesystem::exists(updatesDir / "Geode.dll", error) && !error) {
ghc::filesystem::rename(
updatesDir / "Geode.dll",
workingDir / "Geode.dll", error
);
if (error) {
showError("Unable to update Geode: Unable to move Geode.dll - " + error.message());
return error.value();
}
}
if (ghc::filesystem::exists(updatesDir / "resources", error) && !error) {
ghc::filesystem::remove_all(resourcesDir / "geode.loader", error);
if (error) {
showError("Unable to update Geode resources: " + error.message());
} else {
ghc::filesystem::rename(
updatesDir / "resources",
resourcesDir / "geode.loader", error
);
if (error) {
showError("Unable to update Geode resources: " + error.message());
}
}
}
return loadGeode(module);
}
BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) {
if (reason == DLL_PROCESS_ATTACH) {
HANDLE handle = CreateThread(NULL, 0, load, module, 0, NULL);
if (handle) {
CloseHandle(handle);
} else {
return FALSE;
}
}
return TRUE;
}