Я могу загружать собственные библиотеки по короткому пути к файлу:
Код: Выделить всё
System.load("C:\\msvcp140.dll") // works
Код: Выделить всё
System.load("\\\\?\\C:\\msvcp140.dll") // Exception:
| Exception java.lang.UnsatisfiedLinkError: Can't load library: \\?\C:\msvcp140.dll
| at ClassLoader.loadLibrary (ClassLoader.java:2398)
| at Runtime.load0 (Runtime.java:755)
| at System.load (System.java:1957)
| at (#1:1)
Код: Выделить всё
Exception java.lang.UnsatisfiedLinkError: C:\q72\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_lon
g_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_lon
g_long_long_long_\long_long_long_long_long_long_long_long_long_long_\msvcp140.dll: The filename or extension is too long
- Взлом реестра:
Код: Выделить всё
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem] "LongPathsEnabled"=dword:00000001 - Групповая политика\Политика локального компьютера\Конфигурация компьютера\Административные шаблоны\Система\Файловая система\Включить длинные пути Win32
Я еще не пробовал:
- Символическое связывание файлов во временный каталог, так как этот подход весьма подвержен ошибкам (из-за очистки, которая смехотворно сложна в Windows с ее политикой удаления открытых файлов).
- Определение переменной среды PATH и использование System.loadLibrary(), потому что ChatGPT заявил, что не решит внутренние проблемы Проблема с API. Это сработает для меня, потому что, хотя путь установки является динамическим, я имею полный контроль над запуском приложения и могу переопределить среду.
Я заметил, что "C:\Windows\System32\cabapi.dll" при копировании в глубоко вложенный каталог загружается нормально. Таким образом, поведение зависит от библиотеки! Вот мой тестовый сценарий (остерегайтесь обработки ошибок Powershell по умолчанию):
Код: Выделить всё
$o='C:\Windows\System32\cabapi.dll'
$d='C:\q72\' + $( $("long_" * 10 + "\") * 10)
$ef=$o -replace '\\','\\'
"System.load(`"$ef`")" | jshell -s -
$f=$d+'\test.dll'
New-Item -ItemType Directory -Path $d -Force
Copy-Item $o $f
$ef=$f -replace '\\','\\'
"System.load(`"$ef`")" | jshell -s -
Remove-Item 'C:\q72' -Recurse
В чем разница между msvcp140.dll и cabapi.dll?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -long-path
Мобильная версия