admin 管理员组

文章数量: 887021

java依赖dll,java

我想弄清楚加载DLL失败时缺少哪些从属DLL 。 通过使用Java的System#loadLibrary加载DLL ,我只会得到长的负退出代码,例如-1073741515而不是Windows错误消息,指出缺少哪个DLL 。 这对于解决该问题没有帮助。

我的想法是使用Java从DLL解析依赖的DLL ,然后逐一加载它们,以找出哪个抛出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 entries = new ArrayList();

private List names = new ArrayList();

private List nameTables = new ArrayList();

private List 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用户。

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

本文标签: java依赖dll java