#include "Platform.h" #if defined(PLATFORM_WINDOWS) #include #include #include #include // include after shlobj #include void plat::ReLaunch(int argc, char** argv) { std::string Arg; for (int c = 2; c <= argc; c++) { Arg += " "; Arg += argv[c - 1]; } system("cls"); ShellExecute(nullptr, "runas", argv[0], Arg.c_str(), nullptr, SW_SHOWNORMAL); ShowWindow(GetConsoleWindow(), 0); std::this_thread::sleep_for(std::chrono::seconds(1)); exit(1); } void plat::URelaunch(int argc, char** argv) { std::string Arg; for (int c = 2; c <= argc; c++) { Arg += " "; Arg += argv[c - 1]; } ShellExecute(nullptr, "open", argv[0], Arg.c_str(), nullptr, SW_SHOWNORMAL); ShowWindow(GetConsoleWindow(), 0); std::this_thread::sleep_for(std::chrono::seconds(1)); exit(1); } void plat::set_console_title(const std::string& title) { SetConsoleTitleA(title.c_str()); } void plat::clear_screen() { system("cls"); } LONG OpenKey(HKEY root,const char* path,PHKEY hKey){ return RegOpenKeyEx(root, reinterpret_cast(path), 0, KEY_READ, hKey); } #define MAX_KEY_LENGTH 255 #define MAX_VALUE_NAME 16383 std::string QueryKey(HKEY hKey,int ID){ TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name DWORD cbName; // size of name string TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys=0; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time DWORD i, retCode; TCHAR achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; retCode = RegQueryInfoKey( hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string nullptr, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time BYTE* buffer = new BYTE[cbMaxValueData]; ZeroMemory(buffer, cbMaxValueData); if (cSubKeys){ for (i=0; iFree(pidl); imalloc->Release(); } return path; } return ""; } #include std::string plat::ask_for_folder() { auto folder = impl_ask_for_folder(); while (!std::filesystem::exists(std::filesystem::path(folder) / "BeamNG.drive.exe")) { spdlog::error("This folder ('{}') doesn't contain 'BeamNG.drive.exe', please try again.\n", folder); folder = impl_ask_for_folder(); } return folder; } #endif