+static std::pair<std::wstring, std::wstring> splitOptionName(const std::wstring& name)\r
+{\r
+ std::wstring key = L"Software\\Thingamahoochie\\WinMerge";\r
+ key += L"\\" + name.substr(0, name.find('/'));\r
+ std::wstring name2 = name.substr(name.find('/') + 1);\r
+ return { key, name2 };\r
+}\r
+\r
+std::optional<bool> regReadBool(const std::wstring& name)\r
+{\r
+ std::optional<bool> value;\r
+ HKEY hKey = nullptr;\r
+ auto [keyname, valuename] = splitOptionName(name);\r
+ if (ERROR_SUCCESS == RegOpenKeyW(HKEY_CURRENT_USER, keyname.c_str(), &hKey))\r
+ {\r
+ DWORD type = REG_DWORD, data = 0, size = 4;\r
+ if (ERROR_SUCCESS == RegQueryValueExW(hKey, valuename.c_str(), nullptr, &type, reinterpret_cast<BYTE*>(&data), &size))\r
+ value = data != 0;\r
+ RegCloseKey(hKey);\r
+ }\r
+ return value;\r
+}\r
+\r
+std::optional<int> regReadInt(const std::wstring& name)\r
+{\r
+ std::optional<int> value;\r
+ HKEY hKey = nullptr;\r
+ auto [keyname, valuename] = splitOptionName(name);\r
+ if (ERROR_SUCCESS == RegOpenKeyW(HKEY_CURRENT_USER, keyname.c_str(), &hKey))\r
+ {\r
+ DWORD type = REG_DWORD, data = 0, size = 4;\r
+ if (ERROR_SUCCESS == RegQueryValueExW(hKey, valuename.c_str(), nullptr, &type, reinterpret_cast<BYTE*>(&data), &size))\r
+ value = static_cast<int>(data);\r
+ RegCloseKey(hKey);\r
+ }\r
+ return value;\r
+}\r
+\r
+std::optional<std::wstring> regReadString(const std::wstring& name)\r
+{\r
+ std::optional<std::wstring> value;\r
+ HKEY hKey = nullptr;\r
+ auto [keyname, valuename] = splitOptionName(name);\r
+ if (ERROR_SUCCESS == RegOpenKeyW(HKEY_CURRENT_USER, keyname.c_str(), &hKey))\r
+ {\r
+ std::vector<wchar_t> data(65536);\r
+ DWORD type = REG_SZ, size = static_cast<DWORD>(data.size());\r
+ if (ERROR_SUCCESS == RegQueryValueExW(hKey, valuename.c_str(), nullptr, &type, reinterpret_cast<BYTE*>(data.data()), &size))\r
+ value = data.data();\r
+ RegCloseKey(hKey);\r
+ }\r
+ return value;\r
+}\r
+\r
+bool regWrite(const std::wstring& name, bool value)\r
+{\r
+ bool result = false;\r
+ HKEY hKey = nullptr;\r
+ auto [keyname, valuename] = splitOptionName(name);\r
+ if (ERROR_SUCCESS == RegCreateKeyW(HKEY_CURRENT_USER, keyname.c_str(), &hKey))\r
+ {\r
+ DWORD data = value;\r
+ if (ERROR_SUCCESS == RegSetValueExW(hKey, valuename.c_str(), 0, REG_DWORD, reinterpret_cast<BYTE*>(&data), sizeof(DWORD)))\r
+ result = true;\r
+ RegCloseKey(hKey);\r
+ }\r
+ return result;\r
+}\r
+\r
+bool regWrite(const std::wstring& name, int value)\r
+{\r
+ bool result = false;\r
+ HKEY hKey = nullptr;\r
+ auto [keyname, valuename] = splitOptionName(name);\r
+ if (ERROR_SUCCESS == RegCreateKeyW(HKEY_CURRENT_USER, keyname.c_str(), &hKey))\r
+ {\r
+ DWORD data = value;\r
+ if (ERROR_SUCCESS == RegSetValueExW(hKey, valuename.c_str(), 0, REG_DWORD, reinterpret_cast<BYTE*>(&data), sizeof(DWORD)))\r
+ result = true;\r
+ RegCloseKey(hKey);\r
+ }\r
+ return result;\r
+}\r
+\r
+bool regWrite(const std::wstring& name, const std::wstring& value)\r
+{\r
+ bool result = false;\r
+ HKEY hKey = nullptr;\r
+ auto [keyname, valuename] = splitOptionName(name);\r
+ if (ERROR_SUCCESS == RegCreateKeyW(HKEY_CURRENT_USER, keyname.c_str(), &hKey))\r
+ {\r
+ if (ERROR_SUCCESS == RegSetValueExW(hKey, valuename.c_str(), 0, REG_SZ, reinterpret_cast<const BYTE*>(value.c_str()),\r
+ static_cast<DWORD>((value.length() + 1) * sizeof(wchar_t))))\r
+ result = true;\r
+ RegCloseKey(hKey);\r
+ }\r
+ return result;\r
+}\r
+\r
+bool regDelete(const std::wstring& name)\r
+{\r
+ bool result = false;\r
+ HKEY hKey = nullptr;\r
+ auto [keyname, valuename] = splitOptionName(name);\r
+ if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_CURRENT_USER, keyname.c_str(), 0, KEY_ALL_ACCESS, &hKey))\r
+ {\r
+ if (ERROR_SUCCESS == RegDeleteValueW(hKey, valuename.c_str()))\r
+ result = true;\r
+ RegCloseKey(hKey);\r
+ }\r
+ return result;\r
+}\r
+\r