[libbluray-devel] win32: Use AddDllDirectory instead of SetDllDirectory (when available)

hpi1 git at videolan.org
Thu Mar 2 10:27:44 CET 2017


libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Thu Mar  2 11:24:35 2017 +0200| [98ea1557e130caa9204ab5eb5c013c97b484b12a] | committer: hpi1

win32: Use AddDllDirectory instead of SetDllDirectory (when available)

> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=98ea1557e130caa9204ab5eb5c013c97b484b12a
---

 src/libbluray/bdj/bdj.c | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/src/libbluray/bdj/bdj.c b/src/libbluray/bdj/bdj.c
index 1481e07..2a8f6bf 100644
--- a/src/libbluray/bdj/bdj.c
+++ b/src/libbluray/bdj/bdj.c
@@ -68,6 +68,33 @@ struct bdjava_s {
 typedef jint (JNICALL * fptr_JNI_CreateJavaVM) (JavaVM **pvm, void **penv,void *args);
 typedef jint (JNICALL * fptr_JNI_GetCreatedJavaVMs) (JavaVM **vmBuf, jsize bufLen, jsize *nVMs);
 
+
+#if defined(_WIN32) && !defined(HAVE_BDJ_J2ME)
+static void *_load_dll(const wchar_t *lib_path, const wchar_t *dll_search_path)
+{
+    void *result;
+
+    PVOID WINAPI (*pAddDllDirectory)   (PCWSTR);
+    BOOL  WINAPI (*pRemoveDllDirectory)(PVOID);
+    pAddDllDirectory    = (__typeof__(pAddDllDirectory))    GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "AddDllDirectory");
+    pRemoveDllDirectory = (__typeof__(pRemoveDllDirectory)) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "RemoveDllDirectory");
+
+    if (pAddDllDirectory && pRemoveDllDirectory) {
+        PVOID cookie = pAddDllDirectory(dll_search_path);
+        result = LoadLibraryExW(lib_path, NULL,
+                                LOAD_LIBRARY_SEARCH_SYSTEM32 |
+                                LOAD_LIBRARY_SEARCH_USER_DIRS);
+        pRemoveDllDirectory(cookie);
+    } else {
+        SetDllDirectoryW(dll_search_path);
+        result = LoadLibraryW(lib_path);
+        SetDllDirectoryW(L"");
+    }
+
+    return result;
+}
+#endif
+
 #if defined(_WIN32) && !defined(HAVE_BDJ_J2ME)
 static void *_load_jvm_win32(const char **p_java_home)
 {
@@ -133,9 +160,8 @@ static void *_load_jvm_win32(const char **p_java_home)
         return NULL;
     }
 
-    SetDllDirectoryW(java_path);
-    void *result = LoadLibraryW(buf_loc);
-    SetDllDirectoryW(L"");
+
+    void *result = _load_dll(buf_loc, java_path);
 
     if (!WideCharToMultiByte(CP_UTF8, 0, buf_loc, -1, strbuf, sizeof(strbuf), NULL, NULL)) {
         strbuf[0] = 0;



More information about the libbluray-devel mailing list