在Java中使用VisualBasic DLL

时间:2014-12-24 13:12:09

标签: java vba dll java-native-interface jna

我必须从我的Java应用程序访问Office应用程序的VBA代码,我发现THIS表示我可以使用JNI通过VisualBasic DLL访问VBA代码。如果没有必要,我不想使用COM桥,我宁愿选择DLL解决方案。 我在Visual Studio 2013中创建了一个VisualBasic类库(一个测试它是否有效的简单示例):

Public Class Test1
    Public Function box()
        MsgBox("boxtest!")
    End Function
End Class

我构建的是一个版本,并将其放在我的Java项目中:

public class Test1 {
    static{
        System.loadLibrary("Test1");
    }
    public native void box(); 
}

new Test1().box();正在调用该函数。

我收到以下例外:Exception in thread "main" java.lang.UnsatisfiedLinkError: test.Test1.box()V

我还使用JNA来访问DLL但是经过几个小时的尝试后我无法使用它(我还读到它不能与VisualBasic DLL一起使用)。 我将我的src文件夹的本机库文件夹设置为包含DLL的文件夹。

问题:我可以在Java中使用VisualBasic DLL,如果是,使用JNA或JNI(或两者),如果是这样,我做错了什么,如何正确访问该功能? (我猜其余的返回和参数很容易然后......)

非常感谢您,祝大家圣诞快乐! :)

2 个答案:

答案 0 :(得分:1)

不知道为什么找不到您的图书馆。根据我对JNI的记忆,您似乎没有完成调用本机例程的JNI设置,但错误消息只是说它无法找到它。您可以尝试确定库加载语句是否有效。

DLL是遵循某些规则和约定的库;我不知道" Visual Basic DLL"和任何其他类型。在某种程度上,它们需要是相同的,因为Windows程序不区分用不同语言编写的DLL,afaik,而且我已经完成了VB,足以知道我还没有看到说过的文档"这可以在VB中使用,但不能从其他语言中使用"等。

让JNI / JNA工作变得棘手而乏味。在这种情况下,语言运行时告诉您的正常内容,特别是Java运行时,并不适合您。你必须煞费苦心地浏览你所拥有的任何文档的每一行,你传递的每个参数,每次使用价值与参考等等。

我曾经使用过GitHub库here

祝你好运。

答案 1 :(得分:0)

我还没有找到如何直接从Java调用VB DLL的答案,但经过几天的研究后我发现你可以在C ++包装器的帮助下调用VB DLL。

可能可以使用JNI调用VB DLL方法,但没有关于如何执行此操作的文档。 您可以找到很多关于如何创建能够与JNI specifications from Oracle中的JNI进行通信的C ++库。

在这种特殊情况下(使用Java控制Office应用程序)我建议编写代码以使用C ++访问Office应用程序并创建DLL。

创建可能与JNI交互的C ++ DLL的基本方法是:

  1. 想想你想用C ++创建的方法的名称和.dll-name [NAME] .dll

  2. 为DLL创建一个Java类,加载库:

    static{
      System.loadLibrary([NAME].dll);
    }
    

    必须设置本机库路径(在Eclipse中,右键单击包含类的文件夹,然后单击“构建路径”)。

  3. 包含方法名称public native void [methodname]();

  4. 使用javac.exe编译.java文件(或者让Eclipse完成工作)。

  5. 使用带有-jni参数的javah.exe创建C ++头文件。

  6. 在Visual Studio中创建一个新项目(Visual C ++ MFC DLL)。

  7. 复制创建的头文件(您的Java项目),jni.h(JDK)和jni_md.h(JDK)

  8. 在Visual C ++中包含所有三个头文件 - 项目头文件[项目名称] .h

  9. 在[Project-name] .cpp中包含创建的头文件和jni.h文件。

  10. 在[项目名称] .cpp。

  11. 中写下所需的代码
  12. 构建DLL,将其放在您定义的本机库路径中(请参阅2中的斜体。)。

  13. 跑步并开心!

  14. 抱歉有任何错误!

    可以找到Visual Basic-DLL和JNI的示例1HERE以及其他地方,google" classle"和" JNI" (不能发布2个链接)。