AttilaB
asked on
Calling functions in VB6 ActiveX DLL Using JNI in Java
I have an old VB6 program that is 10 years old, and it is communicating with the COM interface of a commercial program of the time, PADS Layout 2005. I would like to reuse my fully functional code contained in the VB6 program I wrote at the time in a Java program, and also since all the examples for communicating with PADS layout are done in VB6 or a proprietary VB scripting API, it would be very hard to do anything else, practically.
So I want to put all essential code from the VB6 program into a VB6 ActiveX DLL, wrap it into a VC++ DLL and access functions in it it with JNI using Java.
I found a simple example, that looked very reasonable, that worked to a certain point:
https://www.classle.net/book/creation-dll-vb-and-deployment-java-using-jni
It is just adding up 2 int numbers converted to String and displayed, the activeX dll VB6 function used:
I did the exact same thing as suggested in example, same folder structure and file names, and I got all the way to creating the header files, as described at the link above:
4) Now create the JNI header files for the class file using the following command
javah –jni NativeImpl
All I get is various error messages, I tried several things:
I am using an XP virtual machine, Visual Studio 6 installed, which includes Visual Basic 6 and Visual C++ 6.0 to make the wrapper DLL. I am using older Java 1.6, and still I slightly had to change code to avoid using a depricated method. I also did a decompile on the Java class file I created, just to check, but it looks fine to me:
The only change I had to make in the OS is adding a CLASSPATH, so that the javac compiler could be found on command line. that should be enough, right?:
I have all the files, in the zip file on my Google drive:
https://drive.google.com/file/d/0BzAVH2D-BU9IQ21tcDZwb1RhUXc/edit?usp=sharing
(Expert Exchange did not let me upload a zip containing a dll)
Thank you for your help.
So I want to put all essential code from the VB6 program into a VB6 ActiveX DLL, wrap it into a VC++ DLL and access functions in it it with JNI using Java.
I found a simple example, that looked very reasonable, that worked to a certain point:
https://www.classle.net/book/creation-dll-vb-and-deployment-java-using-jni
It is just adding up 2 int numbers converted to String and displayed, the activeX dll VB6 function used:
Public Function add(ByVal a As Integer, ByVal b As Integer)
MsgBox "Result: " + CStr(a + b) 'Convert to String function
End Function
I did the exact same thing as suggested in example, same folder structure and file names, and I got all the way to creating the header files, as described at the link above:
4) Now create the JNI header files for the class file using the following command
javah –jni NativeImpl
All I get is various error messages, I tried several things:
I am using an XP virtual machine, Visual Studio 6 installed, which includes Visual Basic 6 and Visual C++ 6.0 to make the wrapper DLL. I am using older Java 1.6, and still I slightly had to change code to avoid using a depricated method. I also did a decompile on the Java class file I created, just to check, but it looks fine to me:
// Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov Date: 4/18/2014 7:18:57 AM
// Home Page: http://members.fortunecity.com/neshkov/dj.html http://www.neshkov.com/dj.html - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: NativeImpl.java
import java.io.*;
public class NativeImpl
{
public NativeImpl()
{
}
public native void add(int i, int j);
public static void main(String args[])
throws IOException
{
DataInputStream datainputstream = new DataInputStream(System.in);
NativeImpl nativeimpl = new NativeImpl();
System.out.println("Enter number 1 & 2:");
int i = Integer.parseInt(datainputstream.toString());
int j = Integer.parseInt(datainputstream.toString());
nativeimpl.add(i, j);
}
static
{
System.loadLibrary("dllproj");
}
}
The only change I had to make in the OS is adding a CLASSPATH, so that the javac compiler could be found on command line. that should be enough, right?:
I have all the files, in the zip file on my Google drive:
https://drive.google.com/file/d/0BzAVH2D-BU9IQ21tcDZwb1RhUXc/edit?usp=sharing
(Expert Exchange did not let me upload a zip containing a dll)
Thank you for your help.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Do I still need to wrap it into a C++ DLL before I have access to it through JNA?No, JNA can access the library directly
ASKER
Even if it is ActiveX DLL, not a C++ DLL?
Do you know of any good examples or tutorials on that?
Do you know of any good examples or tutorials on that?
ActiveX is little more than a brand name. Also, the language in which is written is irrelevant.The only thing that's relevant is the binary format and its exports
I could only google, like you, for the links to tutorials
I could only google, like you, for the links to tutorials
ASKER
OK. Thanks.
:)
ASKER
If yes, since I don't really have much experience with C++, can you point me to some step-by-step example on how to do that?
(I mostly did Java and VB6)
Or is there perhaps a good working example of how to go from an ActiveX DLL connecting all the way to Java, using JNA?
Thanks.