Нахождение / разрешение зависимых библиотек DLL с помощью Java - PullRequest
0 голосов
/ 22 октября 2019

Я хочу выяснить, какие зависимые 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, не стесняйтесь сообщить мне об этом.

...