LabVIEWForum.de
Methodenaufruf aus Zeigern auf Klassenelementen - 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: Methodenaufruf aus Zeigern auf Klassenelementen (/Thread-Methodenaufruf-aus-Zeigern-auf-Klassenelementen)



Methodenaufruf aus Zeigern auf Klassenelementen - md-knight - 03.08.2007 12:27

Ich habe ein unfreundliches Problem für daß es evtl. gar keine Lösung gibt.

Es geht um Ansteuerung einer Kodak Kamera über LabVIEW.
Die Mitgelieferte dll bietet nur einen Teil der Funktionen z.B. Öffnen der Kameras über USB und Rückgabe eines Zeigers auf ein Kamera Klassenelement.
Das Auslesen der Kameradaten erfolgt laut Beispielcode über die Memberfunction des Klassenelements, welches dann wiederum einen Zeiger auf den Puffer übergibt.
Möglicherweise kann ich diesen Zeiger auf die bekannte Klassenstruktur auf ein Array umlegen und Rückwandeln um an die Daten zu kommen, aber ich sehe keine Möglichkeit aus LabVIEW herraus die Memberfunction aufzurufen die mir den Datenpuffer zurückliefert.

Kennt jemand eine Lösung?

Einzige echte Alternative die ich sehe ist eine weitere dll zu erstellen, welche mir die Methode aufruft und gleich die Pufferadresse liefert.


Methodenaufruf aus Zeigern auf Klassenelementen - IchSelbst - 04.08.2007 10:56

' schrieb:Das Auslesen der Kameradaten erfolgt laut Beispielcode über die Memberfunction des Klassenelements, welches dann wiederum einen Zeiger auf den Puffer übergibt.
Möglicherweise kann ich diesen Zeiger auf die bekannte Klassenstruktur auf ein Array umlegen und Rückwandeln um an die Daten zu kommen, aber ich sehe keine Möglichkeit aus LabVIEW herraus die Memberfunction aufzurufen die mir den Datenpuffer zurückliefert.

Auch ich habe da meine Bedenken. Für Methodenzeiger mit LV bin ich nicht der Experte.

Eigentlich ist LV nicht dafür gedacht ein Unterprogramm (ob VI oder DLL-Knoten) indirekt über einen expliziten Methodenzeiger aufzurufen. Sowas würde zwar auch in einer Datenflusssteuerung funktionieren - allerdings eben nur wenn dieses Feature integriert wäre. Mir jedenfalls ist dieses Feature noch nicht über den Weg gelaufen. Methodenzeiger haben ein ganz spezifisches Format und bedürfen einer ganz bestimmten Verarbeitung. Dieses Format und die Verarbeitung ist so einfach in LV mit "Standard-Komponenten" nicht umsetzbar. Möglicherweise gibt es aber irgendwo in ni.com ein VI, was sowas kann.

Der Zeiger auf den Puffer ist auf jeden Fall in LV handlebar.

Was immer geht ist eine Wrapper-DLL.


Methodenaufruf aus Zeigern auf Klassenelementen - md-knight - 06.08.2007 10:27

Dachte ich mir.

Trotzdem danke, so kann ich mich guten Gewissens an den Workarround machen.


Methodenaufruf aus Zeigern auf Klassenelementen - rolfk - 24.08.2007 10:31

' schrieb:Ich habe ein unfreundliches Problem für daß es evtl. gar keine Lösung gibt.

Es geht um Ansteuerung einer Kodak Kamera über LabVIEW.
Die Mitgelieferte dll bietet nur einen Teil der Funktionen z.B. Öffnen der Kameras über USB und Rückgabe eines Zeigers auf ein Kamera Klassenelement.
Das Auslesen der Kameradaten erfolgt laut Beispielcode über die Memberfunction des Klassenelements, welches dann wiederum einen Zeiger auf den Puffer übergibt.
Möglicherweise kann ich diesen Zeiger auf die bekannte Klassenstruktur auf ein Array umlegen und Rückwandeln um an die Daten zu kommen, aber ich sehe keine Möglichkeit aus LabVIEW herraus die Memberfunction aufzurufen die mir den Datenpuffer zurückliefert.

Kennt jemand eine Lösung?

Einzige echte Alternative die ich sehe ist eine weitere dll zu erstellen, welche mir die Methode aufruft und gleich die Pufferadresse liefert.

Also Du sprichst da von Klassenelementen und das klingt ganz hässlich nach C++. WEnn dem so wäre wirds nicht gehen. LabVIEW kann nicht C++ Objekte direkt durch den Bibliotheksknoten aufrufen. Das fragt absolut sicher nach einer wrapper DLL die Dir zwischen C++ und dem Standard C API das der Bibliotheksknoten unterstützt, übersetzt.

Wenn es nur ein Funktionspointer ist, gibt es aber eventuel eine Möglichkeit. Nur ist die etwas umständlich und ein C Wrapper-DLL hat sich da bei mir bis jetzt noch allemal als die bessere Lösung herausgestellt. Du kannst in LabVIEW eventuel eine DLL generieren die eine Funktion exportiert, wessen Aufrufinterface kompatibel ist mit Deinem Funktionspointer. Ob das wirklich geht ist aber abhängig von den Parametern die diese Funktion benötigt.

Danach kannst Du mit der Windows APIs LoadLibrary() und GetProcAdress() einen Pointer zu dieser LabVIEW DLL Funktion erhalten und diesen an die entsprechende Funktion Deiner anderen Bibliothek geben. Die DLL ruft dann die LabVIEW DLL Funktion auf. Wie gesagt es ist nicht trivial und man braucht echt absolut alle Kenntnis die auch zum Eerstellen einer Wrapper DLL nötig ist um dies erfolgreich zu tun. Daher dass der direkte Gang zur Wrapper DLL für mich eigentlich immer den Vorrang hat.

Rolf Kalbermatter