Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich habe einen dummy c++ DLL projekt mit Visual studio erstellt um einfach einen Library Import in labview auszuprobieren.
das Erstellen von C++ DLL projekt lauft genau wie geschmiert. Daraus habe ich einen Wrapper geschrieben, die nicht anders macht als die dummy Klasse zu Wrappen:
double MyClass::Add(double a, double b)
{
return (a + b);
}
double MyClass::Mult(double a, double b)
{
return (a * b);
}
double MyClass::Subst(double a, double b)
{
return (b - a);
}
double MyClass::Divid(double a, double b)
{
return (b / a);
}
**--> Das Wrapper sieht so aus
Header File:
#pragma once
#include "MyClass.h"
#define DLLIMPORT __declspec (dllexport)
#ifdef __cplusplus
extern "C" { /* using a C++ compiler */
#endif
typedef struct Wrapper
{
void *MYClass;
}Wrapper;
DLLIMPORT Wrapper createWrapper(double a, double b);
DLLIMPORT void destoryWrapper(Wrapper LV_ref);
DLLIMPORT double Add(Wrapper LV_ref, double a, double b);
DLLIMPORT double Subst(Wrapper LV_ref ,double a, double b);
DLLIMPORT double Mult(Wrapper LV_ref,double a, double b);
DLLIMPORT double Divid(Wrapper LV_ref, double a, double b);
#ifdef __cplusplus
}
#endif
*** Wrapper cpp File
#include "C_DllWrapper.h"
DLLIMPORT Wrapper createWrapper(double a, double b)
{
Wrapper wrapper = {static_cast<void*>(new MyClass(a,b)) };
return wrapper;
//new MyClass(a,b);
}
DLLIMPORT double Mult(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Mult(a, b);
}
DLLIMPORT double Subst(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Subst(a, b);
}
DLLIMPORT double Divid(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Divid(a, b);
}
--> so weit so gut .
Ich kann daraus das DLL File erzeugen.
Ich habe dann mit Labview einen DLL Import durchgeführt.
Ich bekomme auch keinen Fehlermeldung.
--> hier ist das Problem:
bei einen einfache Test der funktionen bekomme ich einen komischen Ergebnisse:
wie z.B bei einen einfache Addition von zwei werte von type double
add(1,2) ich bekomme als Ergebnis 2,28614E-253
bei Multiplikation von 1*2 oder 2*3 oder ... = 0 (Ergebnis ist immer einen 0).
die lösung ist bestimmt einfach aber ich weiss es nicht was und wo ich in Labview was einstellen muss .
ich habe es einen C_DLL_Wrapper geschrieben für einen C++ Anwenung.
Durch dieses C_DLL_Wrapper exportiere eine Paare Funktionenen in Labview.
Leider funktioniert das ganze nicht wie gerne hätte.Die Funktionen werde sauber exportiert ohne Fehlermeldung aber erste wenn ich eine Funktionen ausführe bekomme ich eine Fehlermeldung mit dem Nummer 1097 sonst gar keine andere Hinweise.
Dazu habe ich eine Frage: Soll ich auf irgendwas achten, wenn die Funktionen ( auf der C++ Seite) tief verschachtelt sind?
25.08.2014, 09:39 (Dieser Beitrag wurde zuletzt bearbeitet: 25.08.2014 09:39 von GerdW.)
Ich habe es einen dummy DLL Projekt erstellt wo ich ich mir zwei Zahlen addiere,multipliziere, vergleiche .... aber halt nur einen Klasse erstellt.
Dieses Beispiel sieht so aus :
--> Header File
myClass
{
};
--> CPP File der Klasse myClass: ...
dann meine C_Wrappper Header
und dann die Implemtiereung der C_Wrapper
Das DLL kann ich erstellen und ohne problem in Labview importieren.
Alle Funktionen kann ich die auch exportieren und testen .. alles funktioniert wie es sein muss
Wenn ich aber meine richtigen DLL_Projekt wo es viele Klassen gibt, importiere und testen möchte bekomme ich immer eine Fehlermeldung mit dem Nummer 1097.
Diese Fehlermeldung tritt bei jede Funktion, die ich in Labview ausführe sonst nichts
Ich bin in der Labview ganz neu und mache ich engentlich in dieses Projekt keine Labview Programmierung sondern einfach einen DLL Import mit der dazugehörige Header File
(25.08.2014 12:19 )galilio schrieb: Ich habe es einen dummy DLL Projekt erstellt wo ich ich mir zwei Zahlen addiere,multipliziere, vergleiche .... aber halt nur einen Klasse erstellt.
Dieses Beispiel sieht so aus :
--> Header File
myClass
{
};
--> CPP File der Klasse myClass: ...
dann meine C_Wrappper Header
und dann die Implemtiereung der C_Wrapper
Das DLL kann ich erstellen und ohne problem in Labview importieren.
Alle Funktionen kann ich die auch exportieren und testen .. alles funktioniert wie es sein muss
Wenn ich aber meine richtigen DLL_Projekt wo es viele Klassen gibt, importiere und testen möchte bekomme ich immer eine Fehlermeldung mit dem Nummer 1097.
Diese Fehlermeldung tritt bei jede Funktion, die ich in Labview ausführe sonst nichts
Ich bin in der Labview ganz neu und mache ich engentlich in dieses Projekt keine Labview Programmierung sondern einfach einen DLL Import mit der dazugehörige Header File
Danke in Voraus
Fehler 1097 besagt grundsätzlich dass die DLL etwas tut was LabVIEW nicht gut findet. Das kann ein Bug sein in der DLL selber indem sie etwa Speicher anspricht den sie eben nicht sollte, aber meist hat es mit einer falschen Konfiguration Deiner Call Library Nodes zu tun. Die Datentypen UND auch ob diese By Reference oder By Val übergeben werden muss genau stimmen. Zudem musst Du bei Bufferen die durch die DLL gefüllt werden (Arrays und Strings) immer ganz strikt darauf achten dass diese im LabVIEW Diagram genügend gross prealloziert werden.
Es wäre sinnvoll wenn Du hier zumindest die Header Deiner DLLs als auch die C Sources inklusive Headers Deiner Wrapper DLL und natürlich auch die LabVIEW VIs als Anhang beifügen kannst. Dein ursprünglicher Post mit der Test DLL enthält bereits einige Unschönheiten aber ich gehe nicht im Post alles herauskopieren um es nochmals korrekt hier wieder einzufügen.
Ich hoffe Du hast zumindest einige C Kenntnisse, denn ohne LabVIEW UND C Kenntnisse bist Du eigentlich hier auf verlorenem Posten.
VIs kann ich hier nicht einfügen, da es von mehrere DLLs abhängig sind.
Dieses DLLs dateien sind über 19 MB gross.
Meine Vermutung (ist nur eine Vermutung) warum es nicht funktioniert, ist dieses Funktion :
const char *strFileSettings_p = "settings.ini"; // Kann es sein, dass es hier einen Problem ist !! (es handelt sich um eine Konfiguration Datei)
DLLIMPORT EFILibWrapper create_EFILib(bool boSimulate_p, const char *strFileSettings_p);
"settings.ini" ist eine Konfiguration Datei, muss ich die vielleicht in meinem Library configurieren?
Wenn ja, wie geht es das denn?
Danke in voraus
26.08.2014, 23:16 (Dieser Beitrag wurde zuletzt bearbeitet: 26.08.2014 23:22 von rolfk.)
VIs kann ich hier nicht einfügen, da es von mehrere DLLs abhängig sind.
Dieses DLLs dateien sind über 19 MB gross.
Meine Vermutung (ist nur eine Vermutung) warum es nicht funktioniert, ist dieses Funktion :
const char *strFileSettings_p = "settings.ini"; // Kann es sein, dass es hier einen Problem ist !! (es handelt sich um eine Konfiguration Datei)
DLLIMPORT EFILibWrapper create_EFILib(bool boSimulate_p, const char *strFileSettings_p);
"settings.ini" ist eine Konfiguration Datei, muss ich die vielleicht in meinem Library configurieren?
Wenn ja, wie geht es das denn?
Danke in voraus
Ich habe keine Ahnung was Du damit meinst. Zeig doch mal die VIs!!! Die DLLs brauche ich nicht aber Du kannst hier 100 Seiten Text schreiben was Du alles getan hast und wie und wo, und warum und noch kann ich nicht sehen was Du denn an der LabVIEW Seite wirklich getan hast.
Diese Zeile in Deinem Headerfile tut ABSOLUT nichts:
Code:
const char *strFileSettings_p = "settings.ini";
struct EFILibWrapper ist überflüssig, Du kannst auch genausogut direkt einen void *EFILib als Parameter verwenden und diesen in LabVIEW als Pointer sized integer konfigurieren.
CEFI_Out_Wrapper scheint nicht verwendet aber den solltest Du auch nicht als Funktionsparameter/Rückgabewert irgendwo verwenden. Das in LabVIEW zu interfacen ist ein Alptraum wenn Du nicht wirklich gute Low Level C Kenntnisse hast und ich habe keine Lust Dir das entsprechende VI zu schreiben.