LabVIEWForum.de
Labview Import / DLL debuggen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: Labview Import / DLL debuggen (/Thread-Labview-Import-DLL-debuggen)

Seiten: 1 2 3 4


Labview Import - galilio - 22.08.2014 22:31

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


RE: Labview Import - galilio - 24.08.2014 08:09

Hallo alle zusammen,


es hat sich erledigt.
Es funktioniert es wieder alles genau wie es sein muss


RE: Labview Import - jg - 24.08.2014 08:43

Hast du herausgefunden, was der Fehler war?

Gruß, Jens


RE: Labview Import - galilio - 24.08.2014 10:09

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 ?


wie kann ich duch die DLL Library Debuggen? - galilio - 25.08.2014 08:38

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?


RE: Labview Import / DLL debuggen - GerdW - 25.08.2014 09:39

Anniemacht_2
Beitrag hier angefügt, da es sich wohl immer noch um diese "tief verschachtelte Cpp-Lib" handelt…


RE: Labview Import / DLL debuggen - galilio - 25.08.2014 12:19

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


RE: Labview Import / DLL debuggen - rolfk - 25.08.2014 17:45

(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.


RE: Labview Import / DLL debuggen - galilio - 26.08.2014 07:35

@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


RE: Labview Import / DLL debuggen - rolfk - 26.08.2014 23:16

(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.