LabVIEWForum.de
C++ Dll in Labview einbinden - 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: C++ Dll in Labview einbinden (/Thread-C-Dll-in-Labview-einbinden--25551)

Seiten: 1 2


C++ Dll in Labview einbinden - galilio - 03.03.2014 09:44

Hallo alle zusammen,

Ich habe folgende Problem:

Ich möchte zwei DLL (File, die von einander abhangig sind) mit Labview einbinden.
Diese beide DLL File sind in C++ geschrieben(in Visual Studio 2008).

Meine erste Frage:
Wie aufwendig ist das denn für jemenden, der keine Erfahrung mit Labview hat?
Ich habe Erfahrung nur in C++ bzw. c , Matlab und java.

Zweite Frage:
Wie soll ich ambesten vorgehen?

Danke in voraus


RE: C++ Dll in Labview einbinden - RadioactiveMan - 03.03.2014 11:44

Wie aufwendig ist was?
Das schreiben der DLL oder das Einbinden?

Ich nehme mal an das Einbinden. Das ist einfach. Du musst nur deine Funktionen kennen.
Blockdiagramm>Rechtsklick>Konnektivität>Bibliotheken>DLL


RE: C++ Dll in Labview einbinden - galilio - 03.03.2014 14:13

Das einbinden



in diesem DLL file sind Klassen geht es auch ohne eine Wrapper zu schreiben?


RE: C++ Dll in Labview einbinden - rolfk - 03.03.2014 19:43

(03.03.2014 14:13 )galilio schrieb:  Das einbinden



in diesem DLL file sind Klassen geht es auch ohne eine Wrapper zu schreiben?

Nein! Die Call Library Node kann nur globale exportierte C Funktionen einbinden. Grundsatzlich hast Du damit zwei Möglichkeiten.

1) Alle interessanten Objektmethoden wrappen. Das braucht keine seperate DLL zu sein aber kann auch bei der bestehenden DLL beigefügt werden. Etwas in dieser Art:

Mit der Klassendefinition wie dieser:

Code:
class MyClass
{
     pulic:
          MyClass(int par);
          int Method1(int par);
          int Method2(int par1, double par2);
     private:
          ............
};

würde das ungefähr folgenden extra Code geben:

Code:
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_Method1(MyClass* ref, int par)
{
     return ref->Method1(par);
}

extern "C" declspec(dllexport) int MyClass_Method2(MyClass* ref, int par1, double par2)
{
     return ref->Method2(par1, par2);
}

Die MyClass* Parameter (und Returnwerte) bitte in der Call Library Node als Pointer sized Integer konfigurieren, dann geht's sowohl für Windows 32 bit und 64 bit DLLs automatisch korrekt.

2) Den C++ code in ein ActiveX umwandeln und dann als ActiveX Objekt in LabVIEW einbinden.

Beachte dass LabVIEW nicht die einzige Prograqmmierumgebung ist bei der Du mit dem Einbinden von C++ Code Probleme hast. C#, Matlab, Delphi und so ziemlich jede andere Programmierumgebung die nicht C++ ist hat hier dieselben Probleme. Eigentlich kann man sagen dass C++ nur wirklich zu sich selber komptibel ist und da sogar nur zu Code das mit dem gleichen Compiler erzeugt wurde, denn es besteht keinerlei binärkompatibler C++ Standard.


RE: C++ Dll in Labview einbinden - galilio - 04.03.2014 15:36

@ rolfk

Danke für die Antwort.
Ich habe noch eine Frage bezogen auf deinem Code, der mir leider nicht so ganz klar Blink

Du hast eine Klasse "MyClass" (Header File )wie oben so weit ist alles Okay .

den cpp File mir ist nicht so ganz klar.
Wie ist dein Konstrukt definiert verstehe ich ehrlich nicht.
Kannst du bitte mir noch etwas genauer erklären.

Dir danke ich in voraus


RE: C++ Dll in Labview einbinden - Kiesch - 04.03.2014 15:55

Im Prinzip lässt du die ganze Zeit C arbeiten und musst dafür irgendwie deine Klasse innerhalb von Labview im Speicher halten.

Das heist praktisch: Der erste Codeblock ist einfach nur ein © Wrapper der dir den Konstruktor wrapped. So dass der Labview ne Referenz auf das generierte Objekt weitergibt (die hälst du dann in Labview einfach nur weiter vorrätig). Der Destruktor analog - mit dem Killst du entsprechend dein Objekt wieder nach Beendigung.

Das Eigentlich relevante kommt danach: Da Labview nicht mit dem eigentlichen Objekt arbeitet sondern "nur" eine Referenz darauf aufbewahrt musst du außerdem Wrapper für jede einzelne Methode implementieren die die Methode um eine Referenz auf deine Klasse erweitern, damit Labview seine Referenz dieser Wrapper Methode einfach nur übergeben muss. Der Wrapper wendet dann nur die die eigentliche Methode auf das per Referenz übergebene Objekt an und gibt entsprechend Ausgaben raus.


Kurz und Bündig: Labview speichert in dem Modell nur das Klassenobjekt zwischen ohne irgendwas mit anfangen zu können / die Datenstruktur interpretieren zu können. Dafür muss das Objekt wieder an die DLL zurückgegeben werden die dafür um entsprechende Wrapper Methoden erweitert werden muss.


RE: C++ Dll in Labview einbinden - galilio - 04.03.2014 16:38

ich habe folgende versucht :


header File sieht so aus:
Code:
extern "C" __declspec(dllexport)double Addi(double a, double b);

        // Returns a - b
         extern "C" __declspec(dllexport)double Subtract(double a, double b);

        // Returns a * b
         extern "C" __declspec(dllexport)double Multiply(double a, double b);

        // Returns a / b
        // Throws const std::invalid_argument& if b is 0
         extern "C" __declspec(dllexport)double Divide(double a, double b);

C.File sieht so aus:
Code:
double Addi(double a, double b)
    {
        return a + b;
    }

    double Subtract(double a, double b)
    {
        return a - b;
    }

    double Multiply(double a, double b)
    {
        return a * b;
    }

    double Divide(double a, double b)
    {
        if (b == 0)
        {
            throw invalid_argument("b cannot be zero!");
        }

        return a / b;
    }

Daraus DLL erstellt und in Labview importiert.
Es funktioniert einwandfrei 2hands

Das ist nur zum Einstieg

aber ich möchte C++ DLL file in Labview importieren und komme einfach nihct weiter


ich habe das Beispiel von @rolfk (Dafür danke ich dir) einfach mitgenommen und wollte daraus einen DLL zu erstellen.

Header File sieht so aus:
Code:
class MyClass
{
public:
    MyClass(int par);
    int Methode1(int par);
    int Methode2(int par1,double par2);
    ~MyClass(void);
};


Das Cpp File sieht so aus:

Code:
#include "StdAfx.h"
#include "MyClass.h"

MyClass::MyClass(int par)
{
    // ??

}

MyClass::~MyClass(void)
{
    //??
}

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);
}
Bahn


RE: C++ Dll in Labview einbinden - galilio - 04.03.2014 19:39

Hallo alle zusammen,


ich weiss, dass ich mit meine Anfängliche Fragen störe und das dieses Thema mehr fach vorgekommen ist.
Mir fehlt es die nötige Erfahrung mit Labview und bin für jeden Tipps sehr dankbar.


RE: C++ Dll in Labview einbinden - jg - 04.03.2014 20:01

Offtopic2
Du störst nicht, aber: Ball flach halten und nicht drängeln. Bloß weil du 3 h lang keine Antwort erhalten hast, brauchst du den Thread nicht hochpushen. Das darfst du laut LVF-Regeln frühestens nach 24 h.

Gruß, Jens


RE: C++ Dll in Labview einbinden - galilio - 05.03.2014 07:26

Einen schönen guten Morgen Zusammen,

ich bin gestern Abend im Internet auf folgende Seite "http://labviewwiki.org/DLL/shared_library" gestossen.
Ich könnte dieses Beispiel bei mir in Visual Studio abbilden und daraus einen DLL erstellen.Dann habe ich in Labview importiert.
Es funktioniert alles so weit so gut.

Nur mir ist nicht klar wie ich dieses Beispiel in Labview zum laufen bringen?

anbei die das Labview datei

es fehlt sqrx. vi