2015-07-09 2 views
0

У меня есть некоторые DLL-файлы, которые были использованы некоторыми программами VB, теперь мне нужно переносить приложение в java, но поставщик файлов DLL не предоставляет никаких jars или API для платформы Java. , так как мое требование - получить доступ к коду, написанному в этих DLL-файлах в классе java, есть ли какое-либо решение для aceesss .dll ??Как получить доступ к VB DLL с Java?

thasks заранее ... :)

я также получил одно решение

package jnahelloworldtest; 


import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.NativeLong; 
import com.sun.jna.Platform; 
import com.sun.jna.*; 

/** Simple example of native library declaration and usage. */ 
public class Main { 
    public interface simpleDLL extends Library { 
     simpleDLL INSTANCE = (simpleDLL) Native.loadLibrary(
      (Platform.isWindows() ? "simpleDLL" : "simpleDLLLinuxPort"), simpleDLL.class); 
     // it's possible to check the platform on which program runs, for example purposes we assume that there's a linux port of the library (it's not attached to the downloadable project) 
     byte giveVoidPtrGetChar(Pointer param); // char giveVoidPtrGetChar(void* param); 
     int giveVoidPtrGetInt(Pointer param); //int giveVoidPtrGetInt(void* param); 
     int giveIntGetInt(int a);    // int giveIntGetInt(int a); 
     void simpleCall();      // void simpleCall(); 
    } 

    public static void main(String[] args) { 

     simpleDLL sdll = simpleDLL.INSTANCE; 

     sdll.simpleCall(); // call of void function 

     int a = 3; 
     int result1 = sdll.giveIntGetInt(a); // calling function with int parameter&result 
     System.out.println("giveIntGetInt("+a+"): " + result1); 

     String testStr = "ToBeOrNotToBe"; 
     Memory mTest = new Memory(testStr.length()+1); // '+1' remember about extra byte for \0 character! 
     mTest.setString(0, testStr); 
     String testReturn = mTest.getString(0); // you can see that String got properly stored in Memory object 
     System.out.println("String in Memory:"+testReturn); 

     Memory intMem = new Memory(4); // allocating space 
     intMem.setInt(0, 666); // setting allocated memory to an integer 
     Pointer intPointer = intMem.getPointer(0); 

     int int1 = sdll.giveVoidPtrGetInt(Pointer.NULL); // passing null, getting default result 
     System.out.println("giveVoidPtrGetInt(null):" + int1); // passing int stored in Memory object, getting it back 
     int int2 = sdll.giveVoidPtrGetInt(intMem); 
     //int int2 = sdll.giveVoidPtrGetInt(intPointer); causes JVM crash, use memory object directly! 
     System.out.println("giveVoidPtrGetInt(666):" + int2); 

     byte char1 = sdll.giveVoidPtrGetChar(Pointer.NULL); // passing null, getting default result 
     byte char2 = sdll.giveVoidPtrGetChar(mTest);  // passing string stored in Memory object, getting first letter 

     System.out.println("giveVoidPtrGetChar(null):" + (char)char1); 
     System.out.println("giveVoidPtrGetChar('ToBeOrNotToBe'):" + (char)char2); 

    } 
} 

, но это не могло не помог мне.

+0

Я должен использовать abc.dll, размещенную на моем диске c –

+0

Что он должен делать, и что он делает вместо этого? – immibis

+0

. DLL-файлы похожи на jar в .net или программировании на VB, это ничего, кроме API –

ответ

0

Вы можете использовать DependencyWalker, чтобы выяснить, какие функции экспортируются из библиотеки DLL.

VB использует STDCALL соглашение о вызовах, так что вы должны будете проходить от StdCallLibrary, а не Library, и вы, вероятно, необходимо инициализировать библиотеку с StdCallFunctionMapper, так как экспортируемые методы вашей DLL, скорее всего декорировать имена методов со @NN суффикс.

Map options = new Map(); 
options.put(Library.OPTION_FUNCTION_MAPPER, new StdCallFunctionMapper()); 
SimpleDLL dll = (SimpleDLL)Native.loadLibrary("simpleDLL", SimpleDLL.class, options); 
Смежные вопросы