DLL Befehl Funktionsparameter

TDO88

Bekanntes Mitglied
Hallo Zusammen,

ich möchte die DLL eines Messgerätes nutzen, welches ich hier stehen habe.
Um die einzelnen Funktionen/Methoden der DLL mit ihren Übergabeparametern zu erhalten habe ich den jnaerator benutzt.
In der DLL gibt es die Methode
FPS_Discover (FPS_InterfaceType ifaces, unsigned int *devCount)

FPS_InterfaceType ist ein enum
enum FPS_InterfaceType { IfNone = 0x00, IfUSB = 0x01, IfTcp = 0x02, IfAll = 0x03 }

Jnaerator hat mir die Funktion so übersetzt:
FPS3010DLL.WINCC FPS_discover(FPS_InterfaceType ifaces, IntBuffer devCount);

Und zum Interface Type hat er folgendes erstellt:
Java:
public static class FPS_InterfaceType extends PointerType {
        public FPS_InterfaceType(Pointer address) {
            super(address);
        }
        public FPS_InterfaceType() {
            super();
        }
    };

Jetzt möchte ich die Funktion in meiner Applikation aufrufen, aber bekomme die Parameter nicht zusammen!
Folgender Code dazu:
Java:
int[] devices = new int[10];
IntBuffer devCount = IntBuffer.wrap(devices);
fps3010.FPS3010DLL.FPS_InterfaceType IFType;
FPSInstance.FPS_discover(IFType, devCount);

Der Compiler meckert nun darüber dass IFType evtl. nicht initialisiert wurde! Macht ja auch Sinn, aber wie kann ich die Variable Initialisieren und übergeben?
Hat der Jnaerator da vielleicht auch murks gebaut und die Funktion müsste eigentlich anders aussehen?

Jemand eine Idee?
 
wenn ich das richtig sehe, ist IFType nie initialisiert wenn du es übergibst. welcher wert müsste es denn sein? der compiler würde nix mehr sagen, wenn du einfach inder zeile darüber bei der deklaration mit = null initialisierst
aber es wird leider nicht ersichtlich, welche daten du übergeben möchtest / müsstest
 
Hallo Danke für die Antwort.
Aber Kommando zurück! Das Übersetzen mit dem Jnaerator ist vermutlich schief gelaufen! Ich habe den nochmal drüber über die komplette Header Datei laufen lassen und ein komplett anderes Ergebnis bekommen!
Mit dem neuen Ergebnis gibt es zunächst für den Compiler keine Probleme!
Allerdings klappt das laden der DLL nicht und ich verstehe nicht warum!
Also ich habe eine .java Datei mit
public Interface FPSDLL extends Library{...} mit allen Funktionen der DLL aus dem Jnaerator.
In meiner Applikation steht folgendes:
Java:
public static FPS3010DLL FPSInstance;
public String DLLPath = System.getProperty("user.dir")+"\\fps3010.dll";

try{
     FPSInstance = (FPS3010DLL) Native.loadLibrary(DLLPath, FPS3010DLL.class);
}catch(Exception e){
     JOptionPane.showMessageDialog(FPS3010.this, e.getMessage(), "DLL Load Exception", 0);
}

Die DLL ist im Verzeichnis definitiv vorhanden und wenn ich debugge, steht in DLLPath auch der richtige Pfad drin!
Als Debug Output bekomme ich:
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Unable to load library 'C:\Users\...\Documents\NetBeansProjects\FPS3010\fps3010.dll': Native library (win32-x86-64/C:\Users\...\Documents\NetBeansProjects\FPS3010\fps3010.dll) not found in resource path ([file:/C:/Users/.../Documents/NetBeansProjects/FPS3010/lib/jna-4.1.0.jar, file:/C:/Users/.../Documents/NetBeansProjects/FPS3010/build/classes/])

In der Variable DLLPath steht folgendes: C:\Users\...\Documents\NetBeansProjects\FPS3010\fps3010.dll

Ist das ein 32/64 Bit Problem oder so?

Jemand eine Idee?
 
Habe es nochmal so versucht:
Java:
public interface FPS3010DLL extends Library {
    public static final String JNA_LIBRARY_NAME = LibraryExtractor.getLibraryPath((System.getProperty("user.dir") + "\\fps3010.dll"), true, FPS3010DLL.class);
    public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(FPS3010DLL.JNA_LIBRARY_NAME, MangledFunctionMapper.DEFAULT_OPTIONS);
    public static final FPS3010DLL FPSINSTANCE = (FPS3010DLL)Native.loadLibrary(FPS3010DLL.JNA_LIBRARY_NAME, FPS3010DLL.class, MangledFunctionMapper.DEFAULT_OPTIONS);
...
}

Damit bekomme ich folgende Meldung:
ERROR: Failed to extract library C:\Users\...\Documents\NetBeansProjects\FPS3010\fps3010.dll
java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 7
(?i)C:\Users\...\Documents\NetBeansProjects\FPS3010\fps3010.dll[^A-Za-z_].*


Ist die DLL vielleicht fehlerhaft oder nicht für Java entwickelt?!

Wäre wirklich für jede Hilfe dankbar!
 
Wie hast du denn das Tool zum laufen gebracht? Ich hab zuerst ein git clone gemacht und mvn clean install, aber da kommt gleich ne Fehlermeldung mit parent pom igendwas ...

Hab das Tool dann runtergeladen und java -jar jnaerator.jar usw. versucht, aber der will immer noch eine Header-Datei haben. Wo soll man die denn hernehmen? Man hat doch immer nur die DLLs aufm Rechner.
Kannst du mir da nen Tip geben oder deine Kommando sagen, mit dem du generierst?
 
Wie hast du denn das Tool zum laufen gebracht? Ich hab zuerst ein git clone gemacht und mvn clean install, aber da kommt gleich ne Fehlermeldung mit parent pom igendwas ...

Hab das Tool dann runtergeladen und java -jar jnaerator.jar usw. versucht, aber der will immer noch eine Header-Datei haben. Wo soll man die denn hernehmen? Man hat doch immer nur die DLLs aufm Rechner.
Kannst du mir da nen Tip geben oder deine Kommando sagen, mit dem du generierst?

Ich hatte in diesem Fall glücklicherweise die Header-Datei der DLL!

Zum Problem: Ich habe nochmal mit dem Hersteller des Messgerätes telefoniert und er hat mir eine 64 Bit Version der DLL zukommen lassen und siehe da... es funktioniert! Also war es ein 32/64 Bit Problem
 
Ich hab da auch was übersehen, dachte das Tool kann alle DLLs bedienen, aber da steht ja nur was von c,c++ und objective c ... ich hatte mit einer .net dll was versucht 😡

Ob es so ein Tool auch für .net DLLs und alte VB6 DLLs gibt?
 

Neue Themen


Zurück
Oben