summaryrefslogtreecommitdiff
path: root/platform/uwp
diff options
context:
space:
mode:
authorGeorge Marques <george@gmarqu.es>2018-01-01 13:59:13 -0200
committerGeorge Marques <george@gmarqu.es>2018-01-01 13:59:14 -0200
commit2a023a425dd73ee476aa78fc6a544ea3bfbc010b (patch)
tree64cdf68eeaf3816f60923addf43d23f5e30d167c /platform/uwp
parentabf416f922cb47b32ddc391eb58f1a8572579665 (diff)
Make GDNative DLLs work on UWP
Diffstat (limited to 'platform/uwp')
-rw-r--r--platform/uwp/export/export.cpp11
-rw-r--r--platform/uwp/os_uwp.cpp45
-rw-r--r--platform/uwp/os_uwp.h4
3 files changed, 60 insertions, 0 deletions
diff --git a/platform/uwp/export/export.cpp b/platform/uwp/export/export.cpp
index 9fbbca0716..24e88bcc76 100644
--- a/platform/uwp/export/export.cpp
+++ b/platform/uwp/export/export.cpp
@@ -1024,6 +1024,17 @@ public:
virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) {
r_features->push_back("s3tc");
r_features->push_back("etc");
+ switch ((int)p_preset->get("architecture/target")) {
+ case EditorExportUWP::ARM: {
+ r_features->push_back("arm");
+ } break;
+ case EditorExportUWP::X86: {
+ r_features->push_back("32");
+ } break;
+ case EditorExportUWP::X64: {
+ r_features->push_back("64");
+ } break;
+ }
}
virtual void get_export_options(List<ExportOption> *r_options) {
diff --git a/platform/uwp/os_uwp.cpp b/platform/uwp/os_uwp.cpp
index 3018ac0bef..15bb6fbcf2 100644
--- a/platform/uwp/os_uwp.cpp
+++ b/platform/uwp/os_uwp.cpp
@@ -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)
diff --git a/platform/uwp/os_uwp.h b/platform/uwp/os_uwp.h
index 8d69cd53fd..4d889906c1 100644
--- a/platform/uwp/os_uwp.h
+++ b/platform/uwp/os_uwp.h
@@ -242,6 +242,10 @@ public:
virtual void show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2());
virtual void hide_virtual_keyboard();
+ virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false);
+ virtual Error close_dynamic_library(void *p_library_handle);
+ virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String p_name, void *&p_symbol_handle, bool p_optional = false);
+
virtual Error shell_open(String p_uri);
void run();