INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

DLL findet andere DLL und ini File nicht. Wie einbinden?



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.09.2015, 10:16 (Dieser Beitrag wurde zuletzt bearbeitet: 22.09.2015 12:34 von galilio.)
Beitrag #1

galilio Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 175
Registriert seit: Mar 2014

2015
2013
EN


Schweiz
DLL findet andere DLL und ini File nicht. Wie einbinden?
Hallo alle zusammen,


ich habe mehrere DLL File, die von einander abhängig sind.
Für der erste DLL habe ich eine C_Wrapper geschrieben, damit ich die Funktionen aufrufe.
Zu dieser DLLs ist auch einen file.ini, der gebraucht ist.
Dieses file.ini wird auf DLL seite aufgerufen und gelesen.

Das Thema wurde auch behandelt hier das Links:
http://www.labviewforum.de/Thread-DLL-fi...-einbinden
(11.08.2011 13:50 )rolfk schrieb:  
(11.08.2011 10:47 )pga schrieb:  Hallo zusammen,
ich benutze gerade zum ersten mal Labview und komme nicht so recht weiter. Leider konnten mir Google und die Forensuche nicht weiter helfen.

Ich habe eine DLL ohne Header-Datei. In der Doku sind die Funktionen beschrieben, sodass ich die DLL mittels Call Lib Function Node einbinden kann. Einige Funktionsaufrufe funktionieren auch, allerdings benötigt eine bestimmte Funktion eine weitere DLL. vi-Datei und die beiden DLLs liegen alle im selben Verzeichnis. Muss ich die DLL noch in ein Labview-Verzeichnis kopieren?
Leider habe ich keinerlei Header, sodass das Einbinden via Labview "import" flach fällt.

Viele Grüße,
Philipp

Abhängige DLLs werden nicht von LabVIEW geladen sondern von Windows wenn LabVIEW das Laden der Haupt-DDL verlangt. Windows sucht nur in folgenden Orten:

1) Wenn die DLL mit dem Namen schon im Speicher ist, dann wird die verwendet.
2) Ansonsten wird im Applikationsverzeichnis geschaut (das ist wo LabVIEW.exe ist)
3) Dann wird im Windows Verzeichnis geschaut
4) Danach im System Verzeichnis
5) Zuletzt in allen Verzeichnissen die in der PATH Environment Variablen aufgeführt sind.

3) und 4) fallen eigentlich aus für einen sauberen Lösungsansatz da man nicht unnötigerweise DLLs in diese Verzeichnisse legen sollte

Daher bieten sich folgende Lösungsansätze an:

1) Das Verzeichnis wo die DLL ist in die PATH Variable mitnehmen
2) Die DLL in das Verziechnis kopieren wo LabVIEW.exe ist, wenn Du dann eine Applikation baust musst Du nicht vergessen diese DLL explizit in das Verzeichnis zu installieren wo <myapp>.exe liegt.
3) Durch ein LabVIEW VI eine der Funktionen der DLL in den Speicher laden, bevor das, VI das die andere DLL benötigt geladen wird. Dieses VI würde nicht ausgeführt sondern sorgt nur dafür dass die DLL schon im Speicher ist wenn das andere VI die DLL zu laden versucht.

--> Variante Nr:1:
es funktioniert nicht.
-->Variante Nr:2:
Ja aber unschön
-->Variante Nr:3:
Etwas genauer bitte.


Was ist mein Problem:

1) Wie kann ich alle DLL mittels LabView in einen bestimmten Ordner anlegen und Labview sagen, dass er von dort die DLL lesen muss?
--> Lösungsansatz von Rolf (3): kannst du bitte etwas genauer beschreiben?

2) Wie kann ich den LabVIEW sagen, dass er die file.ini von dort lesen muss?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
22.09.2015, 12:10
Beitrag #2

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: DLL findet andere DLL und ini File nicht. Wie einbinden?
zu 2) Wieso willst du LabVIEW sagen, wie die file.ini aufzurufen ist? Laut deiner Frage liest deine DLL diese Ini-Datei!

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!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.09.2015, 12:32
Beitrag #3

galilio Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 175
Registriert seit: Mar 2014

2015
2013
EN


Schweiz
RE: DLL findet andere DLL und ini File nicht. Wie einbinden?
(22.09.2015 12:10 )jg schrieb:  zu 2) Wieso willst du LabVIEW sagen, wie die file.ini aufzurufen ist? Laut deiner Frage liest deine DLL diese Ini-Datei!

Gruß, Jens

Wie ist das aufgerufen wird, geschieht es schon in der DLL selber.
LabVIEW findet aber die ini file leider nicht.
Die ini File ist auch in der gleischen Ordner wo die DLL auch sind.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.09.2015, 19:42 (Dieser Beitrag wurde zuletzt bearbeitet: 22.09.2015 19:58 von rolfk.)
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: DLL findet andere DLL und ini File nicht. Wie einbinden?
(22.09.2015 12:32 )galilio schrieb:  
(22.09.2015 12:10 )jg schrieb:  zu 2) Wieso willst du LabVIEW sagen, wie die file.ini aufzurufen ist? Laut deiner Frage liest deine DLL diese Ini-Datei!

Gruß, Jens

Wie ist das aufgerufen wird, geschieht es schon in der DLL selber.
LabVIEW findet aber die ini file leider nicht.
Die ini File ist auch in der gleischen Ordner wo die DLL auch sind.

LabVIEW findet die INI file nicht weil es gar nicht danach sucht. Deine DLL tut das und wie sie das tut kann LabVIEW nicht wissen und sollte es auch nicht zu wissen versuchen. LabVIEW weiss nur dass DLL XYZ.DLL von einer Call Library Node angesprochen wird. Von dieser DLL weiss es auch den Pfad. Dann sagt es Windows, bitte lade mir diese DLL und wartet dann einfach bis Windows eine Antwort gibt, entweder: Alles in Ordnung die DLL ist jetzt verfügbar und Du kannst sie aufrufen oder aber, sorry etwas ging schief, Pech gehabt, die DLL konnte nicht geladen werden.
LabVIEW kommt beim ganzen Laden der DLL und etwaiger weiterer DLLs die diese DLL haben möchte nicht mehr ins Spiel.

Zu 3 und 4 das sind die Directories C:\Windows und C:\Windows\System32 wobei Du mit den exakten Namen wieder aufpassen musst. Windows kann während der Installation ein anderer OS-Ordner vorgegeben werden. C:\Windows ist der Default aber das kann auch anders heissen und bei Netzklients sogar auf einem anderen Laufwerk sein. System32 ist auch so eine Sache. Auf einem 32 Bit Windows System ist es System32, aber auf einem 64 Bit Windows System ist es SysWOW64 für eine 32 Bit Applikation und System32 für eine 64 Bit Applikation. Schaust Du noch durch? Blink

Willkürliche DLLs in eines dieser Verzeichnisse zu kopieren ist eine Garantie für Kopfschmerzen und Haarausfall zu einem späteren Zeitpunkt, also simpelweg nicht zu empfehlen. Das Beste ist eigentlich um die DLLs in dasselbe Verzeichnis zu kopieren dann Dein LabVIEW Projekt File. Das funktioniert meistens gut, da LabVIEW Windows dieses Directory als extra Suchoption unterzujubeln versucht. Leider kann das aber in einzelnen Fällen schiefgehen, wenn der DLL Programmierer versuchte schlauer dann Windows zu sein. Wenn alle Stricke reissen bleibt nur, um entweder die DLLs in das LabVIEW Verzeichnis zu kopieren oder Dich mit Deiner PATH Umgebungsvariablen etwas freundlicher zu unterhalten, um dort das Verzeichnis wo alle Deine DLLs liegen einzutragen.

Wie Deine DLL das INI File zu finden versucht kann weder Windows noch LabVIEW wissen. Das weiss nur der Programmierer der DLL und der ist dann auch die einzige Person die abschliessend sagen kann wie das gehen sollte. Wenn er es nicht kann, dann würde ich sowieso kein Vertrauen in die DLL haben.

Und wie stellst Du fest dass Variante 1) nicht funktioniert? Du musst natürlich die DLL(s) selber irgendwie laden bevor Du auch nur ein einziges VI lädst, dass eine Call Library Node enthält das Deine andere DLL laden möchte. Denn Call Library Nodes laden die DLL wenn das entsprechende VI geladen wird, aber Dein Programm kann erst etwas selber zu laden versuchen (etwa durch Aufruf von LoadLibrary()) nachdem die VIs geladen sind.

Workarounds:

1) Du partitionierst Deine Applikation in mehrere Hierarchien, eine die ein Miniprogramm started das etwa einen Splashscreen enthält und Deine sekundären DLLs zu laden versucht und danach erst das HauptVI öffnet und mit Run VI started.

2) Oder Du definierst den Library Path zu Deiner HauptDLL auf dem Diagramm statt in der Call Library Node. Dann wird die DLL erst geladen wenn die Call Library Node das erste Mal ausgeführt wird und kannst Du davor wiederum die anderen DLLs erst laden.

Persönlich würde ich zu 1) tendieren aber grundsätzlich ist die sauberere Lösung die DLLs am richtigen Ort zu haben oder die PATH Variable anzupassen.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
27.09.2015, 15:43
Beitrag #5

galilio Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 175
Registriert seit: Mar 2014

2015
2013
EN


Schweiz
RE: DLL findet andere DLL und ini File nicht. Wie einbinden?
Hallo Rolf,


ich muss dir 1000 mal danken.
Ich bin ziemlich sehr weit mit meinem Projekt weitergekommen.
Ich kann alle vorgesehenen Funktionen importieren und erfolgreich testen.


Was mir eigentlich stört ist, dass die Performance der SW darunter leidet.
Bei der Ausführung der Funktionen ist LabVIEW ziemlich langsam, was auch verständlich ist.
Grund: Es muss immer wieder mehrere DLL laden und das ist genau was du auch gesagt hast.
LabVIEW kann nicht mehr ins spiel kommen.

Die Ausführung der Funktionen ist etwas langsamer als beim normale SW.
Unter Normale SW meine ich, die Desktop-Applikation mit Visual Studio.

Zurück zu Thema:

1) Die Problematik mit der Ini File ist von Tisch --> problem ist gelöst "Die Lösung ist auf C++ Seite implementiert"

2) alle abhängige DLL in der PATH Environment Variablen zu kopieren hat leider nicht funktioniert.
--> Zu Ergänzung:
Mit der "PATH Environment Variablen" ist gemeint der Umgebungsvariable, der unter BenutzerKonten und .... zu finden ist.

3) bei dieser Interface sind 9 Funktionen zu Verfügung also damit ich von einem Zustand zu anderen wechsele wäre nicht besser einen State Machine zu programmieren?

Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Import Assistent findet Funktionen nicht TDO 1 5.636 11.12.2014 16:24
Letzter Beitrag: jg
  DLL findet andere DLL nicht. Wie einbinden? pga 3 8.402 12.08.2011 07:22
Letzter Beitrag: gottfried
  dll einbinden Fehler: Funktion in Bibliothek nicht gefunden mrstrom 1 7.556 06.12.2010 13:40
Letzter Beitrag: oenk

Gehe zu: