Я пытаюсь получить доступ к методам файла DLL в Java.
Я хотел использовать ComfyJ создать обертку для файла DLL.
У ComfyJ есть мастер для этого, однако, когда я выбираю файл DLL, он говорит, что не может использовать этот тип файла DLL.
Итак, затем я попытался использовать JNIWrapper мастер, но это требует .h
файл. Проблема в том, что у меня нет .h
файл для этой DLL.
(У меня есть коммерческая лицензия на оба этих инструмента).
Я немного удивлен, что нет способа экспортировать или создать .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
файл).
Задача ещё не решена.
Других решений пока нет …