LabVIEWForum.de - C++ Dll in Labview einbinden

LabVIEWForum.de

Normale Version: C++ Dll in Labview einbinden
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo alle zusammen,


Danke an alle.

Es hat mit diesem demo Projekt alles funktioniert.Big Grin
in meinem Projekt sieht die lage etwas anders.

Ich habe zwei DLL File die eigentlich von einander abhängig sind.
Das DLL2 wird von DLL 1 gebraucht.
Die Funktionalität, die ich brauche befindet sich In DLL2.

Ich weiss es nicht wie ich am besten vorgehen soll?
Soll ich für jede DLL eine Labview Import mit der nötige DLLWrapper und dann die Funktionen mit Labview konfigurieren?

Wenn ich nur für DLL1 einen Labview Import mache und bestimmte funktionalität von DLL1 gebraucht sind dann funktioniert das ganze bestimmt nicht.

Ist meine vorhaben überhaupt machbar?
Ich frage am besten bevor ich auf die schnauze falle Blink
Noch eine Frage Bitte:
Beim DLL erstellung:
spielt eine Rolle, ob der DLL von eine Release Version oder Debug Version ist?
(06.03.2014 09:38 )galilio schrieb: [ -> ]Noch eine Frage Bitte:
Beim DLL erstellung:
spielt eine Rolle, ob der DLL von eine Release Version oder Debug Version ist?

Solange Du die DLL nur auf dem Entwickelsystem ausführen willst, auf dem Du auch den C Compiler installiert hast nicht. Aber wenn Du das auf einem anderen Rechner auch testen willst kommst Du legal nur mit einer Release DLL weiter. Die Debug DLL linkt mit einer speziellen Version der C Runtime. Für diese hast Du zumindest bei Visual C keinerlei Rechte diese zu distributieren oder auch nur auf einem anderne Rechner zu installieren, ohne dort auch eine lizenzierte Visual C Installation zu machen.

Was die anderen Probleme betrifft, begreife ich eigentlich nur Bahn. So wie sich das mir darstellt, ist das Problem nicht so sehr dass Du LabVIEW nicht begreifst, sonderen eigentlich auch wenig Ahnung hast wie man überhaupt C++ Code aus jeder beliebigen nicht C++ Umgebung aufrufen sollte.

LabVIEW kann nur globale Funktionen aus einer DLL importieren, keine Objektmethoden. (Und nicht nur LabVIEW! C++ Objektcode kann grundsätzlich nur in ein Projekt gelinkt werden dass mit dem gleichen C++ Compiler compiliert wird, wie die Bibliothek selber, teilweise geht es sogar schon verkehrt bei unterschiedlichen Versionen des selben Compilers. Selbst wenn Du eine C++ DLL machst würdest Du ziemlich sicher gewaltig auf die Schnauze fallen, wenn Du diese DLL in einem Projekt verwenden möchtest, das mit einem anderen Compiler erzeugt wird dann die DLL selber. Es gibt nämlich keinerlei Binärstandard für C++ Bibliotheken und wenn es ihn gäbe würde sich keiner der Compilerhersteller 100% daran halten.)

In Deinem Beispiel solltest Du wohl am besten den Code so aufteilen:

MyClass.cpp ist die Implementation Deiner Klasse. Was Du darin haben willst ist wirklich Deine Sache, respektive hat Deine DLL ja hoffentlich schon (natürlich heisst das da nicht MyClass!!).
Code:
#include "StdAfx.h"
#include "MyClass.h"

MyClass::MyClass(int par)
{
    // ??
    Ja das ist Dein Objekt!!! Was Du da im Konstruktor haben musst ist Deine Sache!
}

MyClass::~MyClass(void)
{
    //??
    Dasselbe in grün
}

==> Irgendwo müsste auch noch die Implementation von

int MyClass:: Methode1(int par)
{
    // ??
    return something;
}

int MyClass::Methode2(int par1, double par2)
{
    // ??
    return something;
}

Nun kommt der Wrapper z.B. in file MyClassWrap.cpp

Code:
#include "MyClass.h"

extern "C" __declspec(dllexport) MyClass* createMyClass(int par)
{
     return new MyClass(par);
}
extern "C" __declspec(dllexport) void destroyMyClass(MyClass* ref)
{
     delete ref;
}

extern "C" __declspec(dllexport) int MyClass_Methode1(MyClass* ref, int par)
{
     return ref->Methode1(par);
}

extern "C" __declspec(dllexport) int MyClass_Methode2(MyClass* ref, int par1, double par2)
{
     return ref->Methode2(par1, par2);
}

In LabVIEW kannst Du nun mit der Call Library Node folgende Funktionen einlinken:

void* createMyClass(int);
void destroyMyClass(void*);
int MyClass_Methode1(void*, int);
int MyClass_Methode2(void*, int, double);

Wenn das noch nicht deutlich ist kann ich auch nicht mehr helfen.
Seiten: 1 2
Referenz-URLs