From d9c7bbd0469af659527ea00d9f2574b0b8cc2e3d Mon Sep 17 00:00:00 2001 From: Thad House Date: Mon, 29 Jun 2020 16:33:26 -0700 Subject: [PATCH] [wpiutil] Restore existing dll directory when setting dll directory (#2559) * Allow getting existing dll directory when setting dll directory --- .../edu/wpi/first/wpiutil/CombinedRuntimeLoader.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/wpiutil/src/main/java/edu/wpi/first/wpiutil/CombinedRuntimeLoader.java b/wpiutil/src/main/java/edu/wpi/first/wpiutil/CombinedRuntimeLoader.java index b54ccf6c7b..8f0d53e76a 100644 --- a/wpiutil/src/main/java/edu/wpi/first/wpiutil/CombinedRuntimeLoader.java +++ b/wpiutil/src/main/java/edu/wpi/first/wpiutil/CombinedRuntimeLoader.java @@ -34,7 +34,7 @@ public final class CombinedRuntimeLoader { extractionDirectory = directory; } - public static native boolean addDllSearchDirectory(String directory); + public static native String setDllDirectory(String directory); private static String getLoadErrorMessage(String libraryName, UnsatisfiedLinkError ule) { StringBuilder msg = new StringBuilder(512); @@ -126,7 +126,12 @@ public final class CombinedRuntimeLoader { public static void loadLibrary(String libraryName, List extractedFiles) throws IOException { String currentPath = null; + String oldDllDirectory = null; try { + if (RuntimeDetector.isWindows()) { + var extractionPathString = getExtractionDirectory(); + oldDllDirectory = setDllDirectory(extractionPathString); + } for (var extractedFile : extractedFiles) { if (extractedFile.contains(libraryName)) { // Load it @@ -138,6 +143,10 @@ public final class CombinedRuntimeLoader { throw new IOException("Could not find library " + libraryName); } catch (UnsatisfiedLinkError ule) { throw new IOException(getLoadErrorMessage(currentPath, ule)); + } finally { + if (oldDllDirectory != null) { + setDllDirectory(oldDllDirectory); + } } } @@ -163,7 +172,6 @@ public final class CombinedRuntimeLoader { // Load windows, set dll directory currentPath = Paths.get(extractionPathString, "WindowsLoaderHelper.dll").toString(); System.load(currentPath); - addDllSearchDirectory(extractionPathString); } } catch (UnsatisfiedLinkError ule) { throw new IOException(getLoadErrorMessage(currentPath, ule));