22.08.2014, 22:31
Beitrag #1
|
galilio
LVF-Gelegenheitsschreiber
Beiträge: 175
Registriert seit: Mar 2014
2015
2013
EN
Schweiz
|
Labview Import
Hallo alle zusammen,
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:
Hier bei ist meine Versuch:
****das C++ Teil:
* header File:
class MyClass
{
public:
MyClass(double, double);
~MyClass();
double Add(double,double );
double Subst(double, double);
double Mult(double, double);
double Divid(double, double);
private:
double m_a, m_b;
};
*CppFile:
#include "stdafx.h"
#include "MyClass.h"
MyClass::MyClass(double a,double b)
{
this->m_a = a;
this->m_b = b;
}
MyClass::~MyClass(){ }
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 void destoryWrapper(Wrapper LV_ref)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
delete myClass;
}
DLLIMPORT double Add(Wrapper LV_ref, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(LV_ref.MYClass);
return myClass->Add(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 .
Für jeden Vorschlag danke ich euch in voraus.
besten Grüsse
|
|
|
24.08.2014, 08:09
Beitrag #2
|
galilio
LVF-Gelegenheitsschreiber
Beiträge: 175
Registriert seit: Mar 2014
2015
2013
EN
Schweiz
|
RE: Labview Import
Hallo alle zusammen,
es hat sich erledigt.
Es funktioniert es wieder alles genau wie es sein muss
|
|
|
24.08.2014, 08:43
Beitrag #3
|
jg
CLA & CLED
Beiträge: 15.864
Registriert seit: Jun 2005
20xx / 8.x
1999
EN
Franken...
Deutschland
|
RE: Labview Import
Hast du herausgefunden, was der Fehler war?
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Einführende Links zu LabVIEW, s. GerdWs Signatur.
|
|
|
24.08.2014, 10:09
Beitrag #4
|
galilio
LVF-Gelegenheitsschreiber
Beiträge: 175
Registriert seit: Mar 2014
2015
2013
EN
Schweiz
|
RE: Labview Import
In der Header Wrapper "#include "MyClass.h" File
habe ich das include von MyClass auskommentiert.
Spiel es das eine Wirkung auf das DLL_Import in Labview ?
|
|
|
25.08.2014, 08:38
Beitrag #5
|
galilio
LVF-Gelegenheitsschreiber
Beiträge: 175
Registriert seit: Mar 2014
2015
2013
EN
Schweiz
|
wie kann ich duch die DLL Library Debuggen?
Hallo alle Zusammen,
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.)
Beitrag #6
|
|
|
26.08.2014, 07:35
Beitrag #9
|
|
|
26.08.2014, 23:16
(Dieser Beitrag wurde zuletzt bearbeitet: 26.08.2014 23:22 von rolfk.)
|
rolfk
LVF-Guru
Beiträge: 2.306
Registriert seit: Jun 2007
alle seit 6.0
1992
EN
2901GG
Niederlande
|
RE: Labview Import / DLL debuggen
(26.08.2014 07:35 )galilio schrieb: @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.
|
|
|
| |