DLL: C++ Addresseninhalt an Labview schicken - 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: DLL: C++ Addresseninhalt an Labview schicken (/Thread-DLL-C-Addresseninhalt-an-Labview-schicken) Seiten: 1 2 |
DLL: C++ Addresseninhalt an Labview schicken - Castorp - 17.08.2011 10:36 Hallo, Ich habe eine DLL in Labview eingebunden. Die Funktion berechnet die Distantz zwischen zwei Geometrien im Raum. Der C++-Code sieht grob wie folgt aus: 1. Objekt m1 wird erstellt (Geometrie 1) 2. Objekt m2 wird erstellt (Geometrie 2) 3. Distance(&dres,&m1,&m2); (Funktionsaufruf, dres=distance result) Ich möchte die DLL jetzt in zwei DLLs aufteilen: In der ersten DLL werden die Objekte erstellt. Die zweite DLL soll nur noch die Funktion Distance(&dres,&m1,&m2); ausführen. Meine Frage ist nun: Wie reiche ich die Adressen &m1 und &m2 and die zweite DLL weiter? Wird der Inhalt der Adresse nicht nach dem Ausführen der ersten DLL gelöscht? Muss ich den Inhalt und nicht nur die Adresse erst an Labview weitergeben und dann an die zweite DLL schicken? Vielen Dank für die Hilfe! Gruß Castorp RE: DLL: C++ Addresseninhalt an Labview schicken - M@rRy - 18.08.2011 13:16 Moin, wie hast du denn deinen C Code eingebunden? Gruß RE: DLL: C++ Addresseninhalt an Labview schicken - Castorp - 19.08.2011 16:52 Hallo, bis jetzt habe ich die Variablen mit Hilfe von Zeigern übergeben. Ich glaube ich kann das Problem jetzt genauer formulieren: Die Objekte m1 und m2 gehören zu einer Klasse und zwar zur Klasse "Model". "buildmodel" heißt die Funktion der DLL. x, y und z sind Arrays der Punkte, die die Geometrie beschreiben. OURDLL_API int* buildmodel(double *x, double *y, double *z) { ....erstelle Objekt.... return &m1; } -> error C2440: 'return': 'Model *' kann nicht in 'int*' konvertiert werden Wie kann ich ein Objekt an Labview schicken? Gibt es Zeiger, die nicht an einen Datentyp gebunden sind? Dankeschön für eure Hilfe. Gruß Castorp RE: DLL: C++ Addresseninhalt an Labview schicken - jg - 19.08.2011 17:01 Ein Zeiger ist ja nichts anderes als eine Adresse im Speicher (also eine U32 / U64). Wenn du also so tust, als ob der Rückgabewert eine U32 ist, solltest du den Zeigerwert erhalten. Gruß, Jens RE: DLL: C++ Addresseninhalt an Labview schicken - Castorp - 22.08.2011 13:10 Danke, Jens! Das hat mich schonmal weitergebracht. Es funktioniert mit dem Rückgabewert void*. Allerdings gebe ich jetzt die Adresse einer lokalen Variable zurück, d.h. der Inhalt wird in Labview möglicherweise überschrieben oder geht verloren, habe ich das richtig verstanden? Ist es möglich den Inhalt zu sichern, ohne den gesamten Inhalt als Variable ausgeben zu müssen? RE: DLL: C++ Addresseninhalt an Labview schicken - rolfk - 24.08.2011 09:10 (22.08.2011 13:10 )Castorp schrieb: Danke, Jens! Das hat mich schonmal weitergebracht. Es funktioniert mit dem Rückgabewert void*. Also Du musst Dir einfach auch bewusst werden über die Lebenszeit von Variablen und Objekten. Das ist nicht dasselbe. class { } MyObject; MyObject * function(x, y, z) { MyObject *o = new MyObject; ........ return o; } o ist zwar eine lokale Variable und wird ungültig nach der Rückkehr der Funktion. Das heisst aber nicht dass das Objekt auf das o zeigt auch ungültig wird. C++ kennt schliesslich keine automatische Garbage Collection die sowas tun könnte. Ein Objekt wird nur ungültig wenn man es mit delete auch wieder aus dem Speicher entfernt und das sollte man auch tunlichst tun, ansonsten bekommst Du echte Speicherleaks. Das ist auch der Grund warum ich persönlich obige Implemtation nicht so empfehle. Es geht zwar und auch gut, wenn der LabVIEW Programmierer weiss was er tut und die entsprechenden Paradigmen kennt, aber die meisten LabVIEW Programmierer sind gewöhnt dass man zum debuggen ein VI abbrechen kann und dann wieder neu starten. Wenn man das in einem VI oder Applikation tut in der solche C++ Objekte angelegt werden, und zwar irgendwo zwischen dem Anlegen und wieder Freigeben der Objekte, erzeugt man Memoryleaks die in manchen Fällen durchaus ein Problem werden können. Und wenn der weniger bedarfte LabVIEW Programmierer gar vergisst die Freigabefunktion aufzurufen läuft die Applikation nicht mal in non-debug sehr lange. RE: DLL: C++ Addresseninhalt an Labview schicken - Castorp - 25.08.2011 14:19 Danke für die ausführliche Erklärung! RE: DLL: C++ Addresseninhalt an Labview schicken - Castorp - 01.09.2011 13:46 Wenn ich die Adresse von &m1 und &m2 in Labview entgegen nehme, kann ich sie in Labview als Integer anzeigen lassen, z.b "1240624". Die zweite DLL soll diese Adresse nun entgegennehmen und die Distanzeberechnung ausführen. Ich habe dazu jeweils die Adresse auf einen Pointer des Objekttypen (Model) gecastet. Die Adresse des Pointers sollte dann der Addresse des Objekts entsprechen. OURDLL_API double* distance(double *x, double *y, double *z, int m1address, int m2address) { Model *m1 = reinterpret_cast<Model*>(m1address); Model *m2 = reinterpret_cast<Model*>(m2address); Distance(&dres,m1,m2); return dres.distance; } Es gibt zwar beim kompilieren keine Fehlermeldung. Die Berechnung ist aber falsch. Muss ich evtl. die Adresse von integer in eine hexadezimal Zahl überführen, um sie zu casten (z.b. "1240624" ->"12EE30")? Ist mein Ansatz logisch korrekt, oder gibt es eine andere Möglichkeit? RE: DLL: C++ Addresseninhalt an Labview schicken - rolfk - 07.09.2011 19:44 Das geht viel einfacher: Code: OURDLL_API double* distance(double *x, double *y, double *z, Model* m1address, Model* m2address) Und in LabVIEW machst Du davon einfach ein Pointer sized integer für die Model Parameter. Das solte für neuere LabVIEW Versionen sogar als Funktionsreturnwert möglich sein. RE: DLL: C++ Addresseninhalt an Labview schicken - Castorp - 12.09.2011 10:07 So habe ich das auch schon probiert, allerdings gibt es dann beim Kompilieren einen Fehler: Code: error C2061: Syntaxfehler: Bezeichner 'Model' Heißt das ich kann nur innerhalb der Funktion Zeiger der Klasse "Model" erstellen? |