INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Dieses Thema hat akzeptierte Lösungen:

Labview Import / DLL debuggen



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!

18.09.2015, 19:50 (Dieser Beitrag wurde zuletzt bearbeitet: 18.09.2015 19:54 von rolfk.)
Beitrag #18

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Labview Import / DLL debuggen
(18.09.2015 18:38 )galilio schrieb:  
(17.09.2015 17:35 )galilio schrieb:  Hallo Rolf,

Danke für deinen Tipp.

Ich habe es jetzt meine Dammy Projekt so angepasst:

Header File:
Code:
#pragma once
#ifdef __cplusplus
#endif
        extern "C"__declspec(dllexport) void* createWrapper(double a, double b);
    extern "C"__declspec(dllexport) void destoryWrapper(void *instance);
    extern "C"__declspec(dllexport) double Add(void *instance, double a, double b);
    .....
#ifdef __cplusplus
#endif

Source Code:
Code:
#include "stdafx.h"
#include "MyClass.h"
#include "C_DllWrapper.h"


extern "C"__declspec(dllexport) void* createWrapper(double a, double b)
{
    return new MyClass(a, b);
}

extern "C"__declspec(dllexport) void destoryWrapper(void *instance)
{
    MyClass *myClass = static_cast<MyClass*>(instance);
    delete myClass;
}
extern "C"__declspec(dllexport) double Add(void *instance, double a, double b)
{
    MyClass *myClass = reinterpret_cast<MyClass*>(instance);
    return myClass->Add(a, b);
}
....

static_cast<> und reinterpret_cast<> brauche ich um das Pointer Objekt MyClass
zu casten sonst bekomme ich stets eine Fehlermeldung

Diesem Code kann ich mit Visual Studio und LabVIEW in debug Modus durchlaufen.
Es ist keine Fehler aufgetreten.

Nun habe ich Verständnis Frage:
Als erste muss ich eigentlich das Objekt MyClass erst erzeugen können und das tue in dem ich
die Funktion createWrapper(double a, double b) aufrufe (damit wird das Objekt erzeugzt).
Bis hier ist alles okay.
Wenn ich diese Funktion z.B. :
header Files:
Code:
extern "C"__declspec(dllexport) double Add(void *instance, double a, double b);
Source Files:
Code:
extern "C"__declspec(dllexport) double Add(void *instance, double a, double b)
{
    MyClass *myClass = static_cast<MyClass*>(instance);
    return myClass->Add(a, b);
}
aufrufe, wie kann ich meinem Objekt (Pointer) "MyClass" auf LabVIEW Seite für dieses Funktion bekannt machen?

Kommt drauf an was Du hier meinst. Wenn es nur darum geht dies lauffähig zu machen dann sage LabVIEW halt einfach dass es ein pointer sized integer ist:

Code:
void *instance                       Pointer to some memory location

sagt es ja eigentlich schon. Es ist ein Pointer. LabVIEW kennt selber keine Pointer aber ein Pointer ist eigentlich einfach eine Integernummer. Vor LabVIEW 2009 war das immer equivalent zu einem 32 Bit Integer. Seit LabVIEW 2009 gibt es auch eine 64 Bit Version sodass das nicht mehr stimmt und daher hat LabVIEW in der Call Library Node hinzugelernt und kennt jetzt auch einen pointer sized Integer der je nach Bitgrösse von LabVIEW korrekt übergeben wird. Auf dem LabVIEW Diagram ist es IMMER ein 64 Bit Integer (das KGV von 32 und 64).

Wenn Du da ein richtiges seperates Kontrol haben willst, so dass ein Dummyuser nicht per Unglück seinen Geburtstag als MyClass Pointer eingeben kann und Deine DLL dann grausam crasht, dann hast Du ziemlich grosses Pech. Der alte Trick mit der Datalog Refnum mit einem speziellen Enum drin, sodass Du eine spezielle Refnum bekommst die nur zu sich selber verbunden werden kann, funktioniert leider nicht mehr. Da LabVIEW Refnums immer 32 bit sind, würdest Du so Deine 64 Bit Pointer korrumpieren wenn Du sie als LabVIEW refnum behandeln möchtest. Und nein, Refnums heutzutage dazu zu verwenden weil Deine DLL eh nur als 32 Bit DLL kompiliert wird ist keine gute Option mehr. Windows 10 ist nur noch 32 Bit wenn es von einer alten 32 bit Installation geupgradet wird ansonsten ist es nur noch als 64 Bit Version erhältlich. In ein paar Jahren bist Du ein Freak wenn Du 32 Bit Applikationen bei einem Kunden installieren willst.

Der saubere Workaround hier wäre wohl eine LabVIEW Klasse. Der Pointer wird dann als private data der Klasse behandelt und Du schreibst für jede Methode in Deiner DLL eine Klassenmethode als VI. somit kommt der Dummyuser nicht mehr an den Pointer und kann ihn nicht ungültig machen.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Nachrichten in diesem Thema
Labview Import - galilio - 22.08.2014, 22:31
RE: Labview Import - galilio - 24.08.2014, 08:09
RE: Labview Import - jg - 24.08.2014, 08:43
RE: Labview Import - galilio - 24.08.2014, 10:09
RE: Labview Import / DLL debuggen - rolfk - 18.09.2015 19:50

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  USB Relay DLL import hansi9990 3 10.267 02.09.2019 09:15
Letzter Beitrag: hansi9990
  DLL Import externe Struktur in Header bekommen hansi9990 15 24.718 30.09.2016 17:20
Letzter Beitrag: hansi9990
  aus einem Library Import Installer machen galilio 5 13.155 04.04.2016 09:32
Letzter Beitrag: galilio
  DLL Import automatisieren CS 3 8.111 13.02.2015 10:53
Letzter Beitrag: CS
  Import Assistent findet Funktionen nicht TDO 1 5.669 11.12.2014 16:24
Letzter Beitrag: jg
  dll Import richtig verstanden? Gruenschnabel 6 8.350 19.09.2014 10:25
Letzter Beitrag: DATAAHEAD

Gehe zu: