看了一位博主的文章,


自己试了试成功了,最近需要做一个用Java调用VB类库的需求,先自己尝试下创建个VB的类库

 

1.新建一个VB工程,工程类型为ActiveX DLL类型。

2.设定工程的名字和类模块的名字。

    这里我使用的工程的名字是DLLTest,类模块的名字是Class1。

3.在类模块中写入要封装的函数

    这里我写了一个计算长方体的体积的函数,代码如下:

Function calVolume(ByVal a As Double, ByVal b As Double, ByVal c As Double) As Double
    calVolume = a * b * c
End Function

4.保存工程,并生成Dll文件。

    通过选择 ”文件“->”生成DllTest.dll“,生成Dll文件。

    至此,完成Dll文件的制作。

1.新建一个VB工程,工程类型为标准EXE类型。

 

2.注册制作的Dll文件。

    注册命令格式为:regsvr32 dll文件的绝对地址名称

    举例说明:比如我把上面我生成的DllTest.dll放在了E盘的VbTest文件里面了,那么我的注册命令为:regsvr32 E:\VbTest\DllTest.dll。

    如果注册成功,系统会有弹窗提示。

    (测试发现,注册dll文件时,路径文件夹的名字不能有空格)

至于为啥要注册一下,

 看这个回答,

执行注册命令的时候,如果是 Win7 8 10 的话,最好win+X 选管理员的dos界面执行

删除已经注册的dll的话 用 regsvr32 /u  xxx.DLL

4.编写调用Dll文件的相关代码。

   这里我在主窗体中添加了一个按钮,在按钮里面写入了如下代码:

Private Sub Command1_Click()
    Dim MyObj As DllTest.Class1
    Set MyObj = New Class1
    
    Dim aa As Double
    Dim bb As Double
    Dim cc As Double
    Dim tempVolume As Double
    
    aa = 1.1
    bb = 2.2
    cc = 3.3
    tempVolume = MyObj.calVolume(aa, bb, cc)
    MsgBox tempVolume
End Sub

运行一下,没问题。

 

==============接着写

ActiveXComponent sC = new ActiveXComponent("DLLTest.Class1");
        Dispatch sControl = sC.getObject();
        Variant v = Dispatch.call(sControl, "calVolume", new Object[]{10,2,3});
        System.out.println(v.toString());

这4行代码运行,ok  调用到了VB。

遇到的几个问题,

 Dispatch.call(sControl, "calVolume", new Object[]{10,2,3});

第三个参数是你Vb类库的参数 我试了好久这么写可以的,别的类型的话 我还没看。

我的miniVb 6.0是32位的,我64位的JDK不行,调不到可能需要别的操作,以后再看,

我下了一个32位的JDk 1.7    然后jacob用的是 1.18版本


另外 

将jacob.jar 部署在环境变量的jdk的bin目录下。

 将jacob.jar 部署在环境变量的jre的bin目录下。

jacob-1.18-x86.dll 我不太清楚所以 在 bin 和 lib文件夹下都放了

这个为了先实现所以没太深入看