有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

windows使用Java查找/解析DLL的依赖DLL

我想找出加载DLL失败时缺少哪些依赖DLL。通过使用Java^{}加载一个DLL,我只会得到一个长的负退出代码,比如-1073741515,而不是一条Windows错误消息,说明缺少哪个DLL。这无助于解决这个问题

我的想法是使用JavaDLL中解析依赖的DLL,然后逐个加载它们,以找出哪个会抛出UnsatisfiedLinkError。我发现了一个名为^{}的库,它声称可以解析^{} executables,但我无法解析导入的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);
    }
}

^{}'s ^{} works但我需要一个基于Java的解决方案来集成到一个应用程序中,该应用程序分发给不一定安装Visual Studio的用户

如果您认为在使用Java加载DLL时有更好/更简单的方法来找出或防止丢失DLL,也可以随时告诉我


共 (0) 个答案