|
@@ -745,6 +745,51 @@ void OSUWP::hide_virtual_keyboard() {
|
|
|
pane->TryHide();
|
|
|
}
|
|
|
|
|
|
+static String format_error_message(DWORD id) {
|
|
|
+
|
|
|
+ LPWSTR messageBuffer = NULL;
|
|
|
+ size_t size = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
|
+ NULL, id, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&messageBuffer, 0, NULL);
|
|
|
+
|
|
|
+ String msg = "Error " + itos(id) + ": " + String(messageBuffer, size);
|
|
|
+
|
|
|
+ LocalFree(messageBuffer);
|
|
|
+
|
|
|
+ return msg;
|
|
|
+}
|
|
|
+
|
|
|
+Error OSUWP::open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path) {
|
|
|
+
|
|
|
+ String full_path = "game/" + p_path;
|
|
|
+ p_library_handle = (void *)LoadPackagedLibrary(full_path.c_str(), 0);
|
|
|
+
|
|
|
+ if (!p_library_handle) {
|
|
|
+ ERR_EXPLAIN("Can't open dynamic library: " + full_path + ". Error: " + format_error_message(GetLastError()));
|
|
|
+ ERR_FAIL_V(ERR_CANT_OPEN);
|
|
|
+ }
|
|
|
+ return OK;
|
|
|
+}
|
|
|
+
|
|
|
+Error OSUWP::close_dynamic_library(void *p_library_handle) {
|
|
|
+ if (!FreeLibrary((HMODULE)p_library_handle)) {
|
|
|
+ return FAILED;
|
|
|
+ }
|
|
|
+ return OK;
|
|
|
+}
|
|
|
+
|
|
|
+Error OSUWP::get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional) {
|
|
|
+ p_symbol_handle = (void *)GetProcAddress((HMODULE)p_library_handle, p_name.utf8().get_data());
|
|
|
+ if (!p_symbol_handle) {
|
|
|
+ if (!p_optional) {
|
|
|
+ ERR_EXPLAIN("Can't resolve symbol " + p_name + ". Error: " + String::num(GetLastError()));
|
|
|
+ ERR_FAIL_V(ERR_CANT_RESOLVE);
|
|
|
+ } else {
|
|
|
+ return ERR_CANT_RESOLVE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return OK;
|
|
|
+}
|
|
|
+
|
|
|
void OSUWP::run() {
|
|
|
|
|
|
if (!main_loop)
|