Wie funktioniert Einbindung eines dynamischen VIs in eine EXE wirklich?
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!
22.07.2008, 16:38 (Dieser Beitrag wurde zuletzt bearbeitet: 22.07.2008 16:44 von Y-P.)
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Wie funktioniert Einbindung eines dynamischen VIs in eine EXE wirklich?
Hallo,
zuerst einmal:
Ich weiß, wie ich dynamisch aufgerufene VIs in eine EXE einbinde (bei "Source Files" unter "Always Included") und die Einbindung funktioniert auch, nur wundert mich, wie das genau funktioniert.
Wie in meinem ersten Screenshot zu sehen ist, rufe ich ein VI so auf, indem ich einen Plugin-Namen aus der Datenbank hole und den Pfad für das entsprechende Plugin zusammensetze. Der Aufruf funktioniert in der Entwicklungsumgebung natürlich, weil es diesen Pfad gibt. In meiner EXE gibt es aber diesen "Plugin"-Ordner nicht, aber der Aufruf funktioniert trotzdem.
Meine Frage nun:
Wo hinterlegt LabVIEW die Information zu meinem dynamisch aufgerufenen VI?
Die zweite Frage (zu meinem 2. Screenshot):
Wie weiß LabVIEW bei so einem Aufruf (diesmal Applikation und EXE), wo sich das VI genau befindet (dies ist übrigens auch ein VI, dass ich bei "Always included" angegeben habe)? Das habe ich so programmiert und es funktioniert auch problemlos, wieso wundert mich aber doch irgendwie. Ich vermute höchstens, dass LabVIEW das aktuelle Projekt durchsucht und da dann das VI findet.
Normal ist LabVIEW doch empfindlich was Pfade angeht.
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
22.07.2008, 18:46 (Dieser Beitrag wurde zuletzt bearbeitet: 22.07.2008 18:50 von cb.)
Wie funktioniert Einbindung eines dynamischen VIs in eine EXE wirklich?
ich könnt jetz lang und breit was über dies und jenes erzählen, aber am einfachsten erklärt sich das ganze dann doch durch ein "AHA-Erlebnis"
mach mal folgendes in der Entwicklungsumgebung: leg das dynamische VI mal irgendwo in dein Block-Diagramm und mach eine Disable-Struktur drum.
Bei deinem dynamischen Aufruf nimmst du mal den ganzen Pfad weg und hängst statt dem Pfad nur eine String-Konstante mit dem Dateinamen ("blablablab.vi") dran.
Und siehe da: wie von Zauberhand geht das auch ohne Pfade
In deiner Exe mach mal folgendes: Bastel dir einen Dialog, der dir den Inhalt von "all VIs in Memory" in einem Array anzeigt. Wenn du dein dynamisches VI beim Build eingebunden hast, wirst du es in dieser Liste wieder finden ...
Anschließend ersetzt du deine dynamisch erstellte VI Referenz durch eine statische und stellst fest, dass man den ganzen Kram mit Pfad zusammenbauen, etc. gar nicht mehr braucht und dass man ein per statischer VI Referenz eingebundenes VI auch nicht mehr bei "allways include" angeben muss, weil es schon in der VI Hierarchi drin ist
Wie funktioniert Einbindung eines dynamischen VIs in eine EXE wirklich?
' schrieb:Wie weiß LabVIEW bei so einem Aufruf (diesmal Applikation und EXE), wo sich das VI genau befindet (dies ist übrigens auch ein VI, dass ich bei "Always included" angegeben habe)?
Naja, sagen wir mal so: Das VI wird schlicht und einfach - wie alle anderen (sprich statische) auch - in der EXE hinterlegt. Und da sind alle Pfade überflüssig.
Das "Always included" ist eigenlich nur dazu da, dem Linker zu sagen, dass hier noch ein VI ist, das eingebunden werden muss. Statisch aufgerufene VIs kennt bereits der Kompiler, in folge dann auch der Linker.
So stell ich mir das vor (meistens sind meine Vorstellungen richtig ) - aber: so sehr interessiert mich das nicht.
Nur:
Das von i2dx kann ich jetzt nicht so nachvollziehen (möglicherweise hab ich da aber was missverstanden).
Zitat:Anschließend ersetzt du deine dynamisch erstellte VI Referenz durch eine statische und stellst fest, dass man den ganzen Kram mit Pfad zusammenbauen, etc. gar nicht mehr braucht und dass man ein per statischer VI Referenz eingebundenes VI auch nicht mehr bei "allways include" angeben muss, weil es schon in der VI Hierarchi drin ist
Heißt das jetzt irgendwo, dass man "Always included" nicht braucht, wenn das VI in einer Disable-Struktur liegt?
Meine dynamischen VIs hab ich immer in einer Disable-Struktur liegen und zwar in dem VI, in dem sie eben aufgerufen werden. (Das hat den Vorteil, man kann sie mit Doppelklick öffnen). Wenn ich jetzt aber "Always included" nicht mache, dann sind diese VIs in der EXE auch nicht vorhanden, also nicht ausführbar.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
22.07.2008, 20:38 (Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2008 05:39 von Y-P.)
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Wie funktioniert Einbindung eines dynamischen VIs in eine EXE wirklich?
' schrieb:Was ich dann aber nicht verstehe, ist wieso es dann manchmal so wichtig ist, die richtigen Pfade anzugeben (wie im Bsp.).
So genau weiß ich das auch nicht. Aber:
Es gibt solche dynamische und solche. Die einen, siehe dein rechtes Bild oben, werden per "Always included" eingebunden und sind daher praktisch ohne Pfad aufrufbar. Solche VIs sind eigenlich nicht richtig dynamisch. Dynamisch sind sie eigentlich nur deswegen, weil sie applikationsspezifisch explizit über "VI-Server" (für SubPanel etc.) aufgerufen werden. Solche VI's werden zur Kompilierzeit eingebunden.
Dann gibt es aber auch solche dynamische VIs, die tatsächlich erst dann eingebunden werden, wenn sie im Programmablauf eben genau jetzt aufgerufen werden sollen. Solche VI's werden dann zur Kompilierzeit eben nicht eingebunden. Dann aber ist der Pfad wichtig. Für was man dieser Verfahrten braucht, weiß ich jetzt nicht. Ich hab sowas noch nie gebraucht.
Für DLL's in C++/Delphi gilt ähnliches: Linken zur Programmstartzeit und Linken per Programmbefehl LoadLibrary.
Ich glaube wir warten mal auf RolfK.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Wie funktioniert Einbindung eines dynamischen VIs in eine EXE wirklich?
Gute Idee. Freedive könnte es auch noch genauer wissen.
Gruß Markus
' schrieb:Ich glaube wir warten mal auf RolfK.
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Wie funktioniert Einbindung eines dynamischen VIs in eine EXE wirklich?
' schrieb:Wie in meinem ersten Screenshot zu sehen ist, rufe ich ein VI so auf, indem ich einen Plugin-Namen aus der Datenbank hole und den Pfad für das entsprechende Plugin zusammensetze. Der Aufruf funktioniert in der Entwicklungsumgebung natürlich, weil es diesen Pfad gibt. In meiner EXE gibt es aber diesen "Plugin"-Ordner nicht, aber der Aufruf funktioniert trotzdem.
Meine Frage nun:
Wo hinterlegt LabVIEW die Information zu meinem dynamisch aufgerufenen VI?
Das verstehe ich jetzt auch nicht ganz, den Ordner "Plugin" gibt es schon irgendwo auf der Festplatte, oder?
Das ist ja auch der Sinn eines "Plugin", in einer EXE zusätzliche Funktionen via eines VI's das irgendwo auf der Festplatte liegt, deshalb braucht es ja auch einen Pfad. Dann kommt noch hinzu, ob du in der INI zur EXE noch den Suchpfad drinn hast, sollte eigentlich nicht sein.
Und was dein "currentDirectory.vi" macht, hat wohl auch noch einen Einfluss darauf.
' schrieb:Die zweite Frage (zu meinem 2. Screenshot):
Wie weiß LabVIEW bei so einem Aufruf (diesmal Applikation und EXE), wo sich das VI genau befindet (dies ist übrigens auch ein VI, dass ich bei "Always included" angegeben habe)? Das habe ich so programmiert und es funktioniert auch problemlos, wieso wundert mich aber doch irgendwie. Ich vermute höchstens, dass LabVIEW das aktuelle Projekt durchsucht und da dann das VI findet.
Eine LV-EXE ist eigentlich eine erweiterte LLB. Du kannst deine.exe in deine.llb umbennen und mit LV die LLB öffnen.
Da siehst du nun welche VI in der EXE drinn sind. In dieser LLB gibt es keine Pfade mehr. Dein dynamisches VI ist dort auch drinn, da du das ja mit der Option "included" definiert hast.
Deshalb findet deine.exe das vi auch.
.·´¯)--> Leben ist das, was dir passiert, wenn du eifrig dabei bist andere Pläne zu machen <--(¯`·.
Wie funktioniert Einbindung eines dynamischen VIs in eine EXE wirklich?
' schrieb:Heißt das jetzt irgendwo, dass man "Always included" nicht braucht, wenn das VI in einer Disable-Struktur liegt?
nein, wenn du das VI in der Entwicklungsumgebung in das Block-Diagramm ziehst und eine Disable-Struktur drum ziest, dann ist das VI trozdem im Speicher vorhanden. Somit kannst du es auch mit der Primitive "Open VI Reference" unter Angabe des Pfades oder des VI Namens referenzieren und dann per VI Server "manipulieren" z.B. starten ...
auf Allways Included kann man beim Bauen der Exe verzichten, wenn man die dynamischen VIs mit einer "statischen VI Referenz" eingebunden hat. Dann ist dieses dynamische VI schon in der VI Hierarchie vorhanden und wird beim Kompilieren automatisch mit in die EXE eingebunden
und wenn man auf so eine statische VI Referenz einen Doppelklick macht dann öffnet sich das entsprechende VI, gerade so als hätte man das als SubVI abgelegt ...
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Wie funktioniert Einbindung eines dynamischen VIs in eine EXE wirklich?
Ich auch.
Gruß Markus
' schrieb:Jetzt hab ichs kapiert.
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------