diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib_package.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/lib_package.c b/src/lib_package.c index 6fac43ec..bedd6d79 100644 --- a/src/lib_package.c +++ b/src/lib_package.c | |||
@@ -76,6 +76,20 @@ static const char *ll_bcsym(void *lib, const char *sym) | |||
76 | BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); | 76 | BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); |
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | #if LJ_TARGET_UWP | ||
80 | void *LJ_WIN_LOADLIBA(const char *path) | ||
81 | { | ||
82 | DWORD err = GetLastError(); | ||
83 | wchar_t wpath[256]; | ||
84 | HANDLE lib = NULL; | ||
85 | if (MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, 256) > 0) { | ||
86 | lib = LoadPackagedLibrary(wpath, 0); | ||
87 | } | ||
88 | SetLastError(err); | ||
89 | return lib; | ||
90 | } | ||
91 | #endif | ||
92 | |||
79 | #undef setprogdir | 93 | #undef setprogdir |
80 | 94 | ||
81 | static void setprogdir(lua_State *L) | 95 | static void setprogdir(lua_State *L) |
@@ -119,7 +133,7 @@ static void ll_unloadlib(void *lib) | |||
119 | 133 | ||
120 | static void *ll_load(lua_State *L, const char *path, int gl) | 134 | static void *ll_load(lua_State *L, const char *path, int gl) |
121 | { | 135 | { |
122 | HINSTANCE lib = LoadLibraryExA(path, NULL, 0); | 136 | HINSTANCE lib = LJ_WIN_LOADLIBA(path); |
123 | if (lib == NULL) pusherror(L); | 137 | if (lib == NULL) pusherror(L); |
124 | UNUSED(gl); | 138 | UNUSED(gl); |
125 | return lib; | 139 | return lib; |
@@ -132,17 +146,25 @@ static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym) | |||
132 | return f; | 146 | return f; |
133 | } | 147 | } |
134 | 148 | ||
149 | #if LJ_TARGET_UWP | ||
150 | EXTERN_C IMAGE_DOS_HEADER __ImageBase; | ||
151 | #endif | ||
152 | |||
135 | static const char *ll_bcsym(void *lib, const char *sym) | 153 | static const char *ll_bcsym(void *lib, const char *sym) |
136 | { | 154 | { |
137 | if (lib) { | 155 | if (lib) { |
138 | return (const char *)GetProcAddress((HINSTANCE)lib, sym); | 156 | return (const char *)GetProcAddress((HINSTANCE)lib, sym); |
139 | } else { | 157 | } else { |
158 | #if LJ_TARGET_UWP | ||
159 | return (const char *)GetProcAddress((HINSTANCE)&__ImageBase, sym); | ||
160 | #else | ||
140 | HINSTANCE h = GetModuleHandleA(NULL); | 161 | HINSTANCE h = GetModuleHandleA(NULL); |
141 | const char *p = (const char *)GetProcAddress(h, sym); | 162 | const char *p = (const char *)GetProcAddress(h, sym); |
142 | if (p == NULL && GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, | 163 | if (p == NULL && GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, |
143 | (const char *)ll_bcsym, &h)) | 164 | (const char *)ll_bcsym, &h)) |
144 | p = (const char *)GetProcAddress(h, sym); | 165 | p = (const char *)GetProcAddress(h, sym); |
145 | return p; | 166 | return p; |
167 | #endif | ||
146 | } | 168 | } |
147 | } | 169 | } |
148 | 170 | ||