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!
bisher habe ich mich ausschließlich lesend im Forum beteiligt aber ich stehe vor einem Problem, bei dem ich auf eure Hilfe hoffe. Ich habe schon einige, auch komplexe Applikationen in LV erstellt, stehe nun aber vor einem Problem; dem Einbinden einer DLL in Labview. Ich habe schon vieles zu diesem Thema hier im Forum und auf der NI-Seite gelesen, so ganz schlau bin ich allerdings noch nicht daraus geworden.
Es geht um folgendes, ich möchte mittels COM Objekt mit einer Hardware kommunizieren. Hierfür habe ich die Hersteller SDK mit den DLL Libaries erhalten, allerdings ohne Header (.h) Datei, dafür aber mit einer ausführlichen Dokumentation der einzelnen Funktionen (Parameter, Rückgabewerte usw). Beispielhaft sei im Folgenden mal eine dargestellt: HRESULT GetLastErrorText([out, retval] BSTR* ErrorText )
Ich gehe davon aus, dass ich einen Wrapper verwenden muss, da es sich bei BSTR* um einen Pointer handelt aber wie hat der Wrapper auszusehen? Hat jemand von euch mal einen Wrapper erstellt und kann mir das Grundgerüst zur Verfügung stellen oder mir hilfreiche Tipps geben?
Oder irre ich mich und ich muss keinen Wrapper nutzen?
(28.04.2013 17:09 )OXO schrieb: Oder irre ich mich und ich muss keinen Wrapper nutzen?
Das hängt sehr stark davon ab was Deine COM Objekte zur Verfügung stellen. Wenn das wirklich pure COM Objekte sind dann führt kein Weg an einer Wrapper DLL vorbei. Aber COM ist die Basis von ActiveX und wenn Deine DLLs ein ActiveX Interface zur Verfügung stellen dann kannst Du ganz einfach die LabVIEW ActiveX Funktionen verwenden um diese Komponente aufzurufen.
Versuche mal eine ActiveX Refnum auf das Frontpanel zu legen und dann mit Browse im Rechtsklickmenu Deine DLL anzuwählen. Wenn Sie ein ActiveX Interface hat wird LabVIEW das merken.
Da ich im Moment (ich hoffe das ändert sich bald) noch ziemlich unsicher mit der ganzen COM/ActiveX Materie bin, erkläre ich dir genau was ich gemacht habe und welche Optionen LabView mir nun zur Verfügung stellt. Vielleicht hilft das ja später auch anderen, die ähnliche Probleme haben.
Ich habe eine ActiveXReferenz erzeugt und und in der Typbibliothek meine dll ausgewählt. Als Objekte werden mir die entsprechenden Objekte der dll angezeigt.
Ist das ein hinreichendes Indiz dafür, dass ich keinen Wrapper brauche?
28.04.2013, 20:34 (Dieser Beitrag wurde zuletzt bearbeitet: 28.04.2013 20:47 von OXO.)
Ich habe jetzt mal versucht, eine beliebige andere dll zu laden (gehört nicht zum SDK). Beim Versuch erschien eine Fehlermeldung "Die ausgewählte Datei ist keine .Net-Assembly, Typenbibliothek oder Automations-EXE."
Das macht mir Mut, denn die dll aus dem SDK hat diesen Fehler nicht ausgegeben.
Trotzdem verstehe ich noch nicht so wirklich, wie ich mit dem Datentyp BSTR* o.ä. umgehen soll.
Ach eine Sache fällt mir noch ein, ein weiterer vorkommenden Datentyp ist IComponent. So nun warte ich erstmal auf Antwort, bevor ich meinen Tread total zu spamme.
(28.04.2013 20:34 )OXO schrieb: Ich habe jetzt mal versucht, eine beliebige andere dll zu laden (gehört nicht zum SDK). Beim Versuch erschien eine Fehlermeldung "Die ausgewählte Datei ist keine .Net-Assembly, Typenbibliothek oder Automations-EXE."
Das macht mir Mut, denn die dll aus dem SDK hat diesen Fehler nicht ausgegeben.
Trotzdem verstehe ich noch nicht so wirklich, wie ich mit dem Datentyp BSTR* o.ä. umgehen soll.
Ach eine Sache fällt mir noch ein, ein weiterer vorkommenden Datentyp ist IComponent. So nun warte ich erstmal auf Antwort, bevor ich meinen Tread total zu spamme.
Schliesse mal eine Property Node oder Method Node an die Refnum. Mit den Parameterdatentypen hast Du nichts zu tun, das macht LabVIEW dann für Dich. Für einen BSTR Parameter generiert LabVIEW automatisch einen String Parameter.
Eine Frage fällt mir noch ein, muss ich bei COM Schnittstellen gar nicht das VI Knoten zum Aufruf externer Bibliotheken nutzen? Ich bini davon ausgegangen, dass DLL-Funktionen über dieses VI aufgerufen werden.
Richtig erkannt, bei einer ActiveX oder .NET Schnittstelle machst du alles über Eigenschaften und Methoden des Objekts, den DLL-Knoten brauchst du nicht.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Bisher war ich nie ein großer Freund von .net aber das ändert sich so langsam. In Kombination mit LV scheint das (im Moment zumindest) recht gut zu klappen. Ich werde weiter testen und berichten.