我正在尝试访问 Java 中 DLL 文件的方法。
我想使用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
文件)。