Я хочу выяснить, какие зависимые DLL
s отсутствуют при загрузке DLL
. Загружая DLL
с использованием Java
System#loadLibrary
, я получаю только длинный отрицательный код выхода, например -1073741515
, вместо сообщения об ошибке Windows, в котором указано, что DLL
отсутствует. Это бесполезно для решения проблемы.
Моя идея состояла в том, чтобы разобрать зависимые DLL
s от DLL
, используя Java
и загрузить их один за другим, чтобы выяснить, какой из них выбрасывает UnsatisfiedLinkError
. Я обнаружил библиотеку с именем pecoff4j
, которая утверждает, что выполняет синтаксический анализ PE
исполняемых файлов , но я не могу проанализировать импортированные DLL
имена:
PE pe = PEParser.parse("C:\\Users\\User\\Desktop\\my.dll");
final ImportDirectory importTable = pe.getImageData().getImportTable();
for (int i = 0; i < importTable.size(); i++)
{
String name = importTable.getName(i);
System.out.println(name);
}
Это приводит к следующему исключению, поскольку имена, по-видимому, недоступны:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at org.boris.pecoff4j.ImportDirectory.getName(ImportDirectory.java:39)
ImportDirectory.java
:
package org.boris.pecoff4j;
import org.boris.pecoff4j.util.DataObject;
import java.util.ArrayList;
import java.util.List;
public class ImportDirectory extends DataObject {
private List<ImportDirectoryEntry> entries = new ArrayList();
private List<String> names = new ArrayList();
private List<ImportDirectoryTable> nameTables = new ArrayList();
private List<ImportDirectoryTable> addressTables = new ArrayList();
public void add(ImportDirectoryEntry entry) {
entries.add(entry);
}
public void add(String name, ImportDirectoryTable names,
ImportDirectoryTable addresses) {
this.names.add(name);
nameTables.add(names);
addressTables.add(addresses);
}
public int size() {
return entries.size();
}
public String getName(int index) {
return names.get(index);
}
public ImportDirectoryTable getNameTable(int index) {
return nameTables.get(index);
}
public ImportDirectoryTable getAddressTable(int index) {
return addressTables.get(index);
}
public ImportDirectoryEntry getEntry(int index) {
return entries.get(index);
}
}
Visual Studio
dumpbin
работает , но мне нужно решение на основе Java
для интеграции в приложение, которое распространяется пользователям, у которых не обязательно установлен Visual Studio
.
Если вы считаете, что существует лучший / более простой способ выяснить или предотвратить пропущенные DLL
с при загрузке DLL
с помощью Java
, не стесняйтесь сообщить мне об этом.