(04.09.2015 17:10 )galilio schrieb: Hallo Rolf,
Zurück zum meinen ersten Beitrag im bezug auf das Dummy Projekt "http://www.labviewforum.de/Thread-Labview-Import-DLL-debuggen".
Wenn ich dieses Dummy Projekt in Labview importiere dann funktioniert.
Bei diesem Import stört mich dieses Funktion:
Code:
DLLIMPORT Wrapper createWrapper(double a, double b)
{
Wrapper wrapper = {static_cast<void*>(new MyClass(a,b)) };
return wrapper;
}
Wie soll ich die Rückgabe dieses Funktion auf Labview Seite initialisieren?
Was ist mit der anderen Funktinoen:
Code:
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);
}
Wrapper ist ein C++ Objekt. Als solches ist es für Standard C ein Datenpointer.
Wenn Du dies in LabVIEW jeweils als pointersized Integer konfigurierst sollte es funktionieren. Das hindert einen LabVIEW Programmierer aber nicht mit diesem Integer irgendwelche Kapriolen zu machen wie etwa irgendeinen Wert hinzuzuaddieren oder etwas anderes sinnloses. Dann zeigt der Pointer aber nicht mehr auf das Objekt und beim nächsten Aufruf einer DLL Funktion mit diesem modifizierten "Pointer" krachts gewaltig.
Also pointersized Integer in der Call Library Configuration ist die Lösung aber als VI Library für den Konsum von Durchsnchitt LabVIEW Benützern ist das unzureichend.
Der ganze Klimbim mit static_cast<> erscheint mir übrigens sinnlos. Da kannst Du auch gleich das eigentlich C Objekt als Pointer verwenden statt da ein sinnloses Wrapperobjekt dazwischen zu schalten.
Ein Wrapperobjekt würde nur Sinn machen wenn Du da auch wirklich Wrapperfunktionen definierst etwa um zwischen LabVIEW Datentypen nach C++ und zurück zu konvertieren aber das kannst Du auch in den extern C Wrapperfunktionen direkt machen, die Du ja für den LabVIEW Aufruf erstellen solltest.
Warum nicht einfach etwas in dieser Art??
Code:
extern "C" MyClass* __declspec(dllexport) createMyClass(double a, double b)
{
return new MyClass(a,b);
}