Java — создание файла .h для DLL-файла, если вы знаете сигнатуры метода

Я пытаюсь получить доступ к методам файла DLL в Java.

Я хотел использовать ComfyJ создать обертку для файла DLL.
У ComfyJ есть мастер для этого, однако, когда я выбираю файл DLL, он говорит, что не может использовать этот тип файла DLL.

Мастер ComfyJ для COM

Итак, затем я попытался использовать JNIWrapper мастер, но это требует .h файл. Проблема в том, что у меня нет .h файл для этой DLL.

JNIWrapper нужен файл .h

(У меня есть коммерческая лицензия на оба этих инструмента).

Я немного удивлен, что нет способа экспортировать или создать .h файл для любого данного файла DLL. Я искал в Интернете, но не мог найти инструмент, способный сделать это. Что дает мне ощущение, что мне все еще не хватает некоторой части информации, которой нет в файле DLL, но она будет необходима для создания этой .h файл.

Во-вторых, я действительно знаю все имена методов, параметры и типы возвращаемых данных. Это потому что WinAPIOverride Инструмент может перечислить их для меня. Я даже вижу, какие параметры передаются функциям / методам этого DLL-файла во время работы приложений.

Foo.dll|bool __cdecl ?FooAddBar@@YA_NHHH@Z(int,int,int)

Итак, у меня сложилось впечатление, что у меня есть вся необходимая информация. Прежде чем я войду слишком глубоко … Мой вопрос: как вы думаете, возможно ли, что я создаю это .h файл вручную с помощью блокнота?

Юридическое примечание: этот файл DLL не является предустановленной DLL. Это часть коммерческого приложения, на которое у меня есть действующая коммерческая лицензия. Компания говорит, что я могу свободно использовать их DLL-файл для чего угодно, если я использую его только для личного использования.

Я также пытался написать код jniwrapper самостоятельно.
Результат выглядит примерно так:

    Library lib = new Library("foo", Function.CDECL_CALLING_CONVENTION);
lib.load();

// works fine.
Function f = lib.getFunction("?FooAddBar@@YA_NHHH@Z");

// doesn't work.
f.invoke(null, new Int(), new Int(), new Int());

Результат — необычное исключение:

Exception c0000005, at 157694FA
Access violation: attempting to read memory at address 00000078
Native function stack data: 0,0,0,0,b0dcbfe6,800fdc5,65637845,6f697470,3063206e,30303030,202c3530,31207461,39363735,a414634,65636341,76207373
Exception in thread "main" com.jniwrapper.FunctionExecutionException: c0000005
at com.jniwrapper.Function.invokeCFunc(Native Method)
at com.jniwrapper.FunctionCall.a(SourceFile:127)
at com.jniwrapper.FunctionCall.call(SourceFile:35)
at com.jniwrapper.Function.invoke(SourceFile:188)
at com.jniwrapper.Function.invoke(SourceFile:239)

Это странное имя метода, кажется, правильной формы. Название метода выглядит странно. Я обнаружил, что это потому, что C ++ «кодирует» имена файлов внутри DLL-файлов. ?FooAddBar@@YA_NHHH@Z на самом деле bool FooAddBar (int, int, int),

Тем не менее, похоже, что JNIWrapper предпочитает закодированное имя. Потому что, когда я пытаюсь с коротким именем "FooAddBar" или что-то еще, у меня уже есть исключение, потому что он не может найти метод. С другой стороны, когда я использую закодированное имя метода (т.е. "?FooAddBar@@YA_NHHH@Z"), он находит метод, доказывая, что он правильный.

Однако во время вызова все идет не так. Итак, я предполагаю, что я использую неправильные параметры или что-то в этом роде. Понятно, что я делаю что-то не так и надеюсь, что мастер JniWrapper сможет создать правильную оболочку, которая исправит это. (Тем не менее, в этом случае мне нужно .h файл).

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]