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 

DLLs aus bestimmtem Ordner verwenden nachdem .exe erstellt wurde



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!

17.07.2007, 09:17
Beitrag #1

astraios Offline
LVF-Grünschnabel
*


Beiträge: 44
Registriert seit: Mar 2006

8.5
2006
de

80937
Deutschland
DLLs aus bestimmtem Ordner verwenden nachdem .exe erstellt wurde
Hallo,

ich habe ein kleines Problem mit LabVIEW in Verbindung mit dem Application Builder:

Ich benutze in mehreren VIs eine DLL. Diese befindet sich auf allen Rechnern, auf denen das Programm benutzt werden soll im Verzeichnis "C:_meinDLLVerzeichnismeineDLL.dll".

Der ganze Spaß funktioniert leider auch nur, wenn genau diese DLL aus genau diesem Verzeichnis verwendet wird.

Wenn ich jetzt eine Applikation erzeuge, packt mir der Application Builder eine Kopie der DLL in den Unterordner "data" und verweist die VIs auf dieses File. Wie kann ich das verhindern und sicherstellen, dass in der Applikation nach wie vor "C:_meinDLLVerzeichnismeineDLL.dll" verwendet wird?

Vielen Dank schonmal und viele Grüße!

Robert

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
17.07.2007, 09:26
Beitrag #2

Achim Offline
*****
*****


Beiträge: 4.223
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
DLLs aus bestimmtem Ordner verwenden nachdem .exe erstellt wurde
Ich schätze, wenn du die Suchpfade im Application Builder anpasst, dürfte es gehen...musst du mal ein bisschen spielen!

Aber mal ne Anmerkung: Sinn einer Exe ist doch (auch), sie auf nem anderen Rechner laufen lassen zu können, auf dem LV nicht installiert ist. Dort kann aber auch ne andere Ordnerstruktur vorhanden sein...was ist dann mit deiner DLL? Warum funktioniert es nur, wenn du genau diese eine DLL verwendest?

Gruss
Achim

"Is there some mightier sage, of whom we have yet to learn?"

"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
17.07.2007, 09:50 (Dieser Beitrag wurde zuletzt bearbeitet: 17.07.2007 09:50 von Lucki.)
Beitrag #3

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
DLLs aus bestimmtem Ordner verwenden nachdem .exe erstellt wurde
Genau dieses Problem hatte ich auch geglaubt zu haben, aber es stellte sich beim Start der exe heraus, daß es das Problem gar nicht gibt. Wenn die ddl im data-Ordner nicht gefunden wird (Weil Du sie gelöscht hast) , dann kommt keine Fehlermeldung, sondern LV fängt an zu suchen. Es wird entweder gefunden oder man wird gefragt wo die DLL ist.
Beim nächsten Start ist dann alles OK. Keine Ahnung, wo der gefundene Pfad intern abgespeichert wird.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.07.2007, 08:04
Beitrag #4

astraios Offline
LVF-Grünschnabel
*


Beiträge: 44
Registriert seit: Mar 2006

8.5
2006
de

80937
Deutschland
DLLs aus bestimmtem Ordner verwenden nachdem .exe erstellt wurde
' schrieb:Ich schätze, wenn du die Suchpfade im Application Builder anpasst, dürfte es gehen...musst du mal ein bisschen spielen!

Aber mal ne Anmerkung: Sinn einer Exe ist doch (auch), sie auf nem anderen Rechner laufen lassen zu können, auf dem LV nicht installiert ist. Dort kann aber auch ne andere Ordnerstruktur vorhanden sein...was ist dann mit deiner DLL? Warum funktioniert es nur, wenn du genau diese eine DLL verwendest?

Gruss
Achim

Ja, die EXE soll auch auf Rechnern ohne LabVIEW laufen - nur die Ordnerstruktur wo die DLL liegt ist auf allen Zielrechnern dieselbe, da das Programm nur firmenintern verwendet wird...


Beim Projekt selbst steht die DLL bei den Abhängigkeiten mit drin. Und da bekomm ich die einfach nicht raus... schöner Mist :-(

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.07.2007, 08:33
Beitrag #5

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
DLLs aus bestimmtem Ordner verwenden nachdem .exe erstellt wurde
' schrieb:Wenn ich jetzt eine Applikation erzeuge, packt mir der Application Builder eine Kopie der DLL in den Unterordner "data" und verweist die VIs auf dieses File. Wie kann ich das verhindern und sicherstellen, dass in der Applikation nach wie vor "C:_meinDLLVerzeichnismeineDLL.dll" verwendet wird?
Das ist unlogisch - es muss also anders gehen. Ich kann mir nämlich Fälle vorstellen, wo dieses Verhalten zwangsweise zu Inkompatibilitäten auf Anwendebene führen würde.

Wie ist denn die DLL im DLL-Knoten angegeben? Mit komplettem Pfad ab "C:..." oder ohne alles also nur MyDLL.DLL?

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.07.2007, 08:38 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2007 08:49 von rolfk.)
Beitrag #6

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLLs aus bestimmtem Ordner verwenden nachdem .exe erstellt wurde
' schrieb:Ja, die EXE soll auch auf Rechnern ohne LabVIEW laufen - nur die Ordnerstruktur wo die DLL liegt ist auf allen Zielrechnern dieselbe, da das Programm nur firmenintern verwendet wird...
Beim Projekt selbst steht die DLL bei den Abhängigkeiten mit drin. Und da bekomm ich die einfach nicht raus... schöner Mist :-(

Doch das geht.

Falls Du 8.2 gebrauchst einfach den DLL Path dynamisch als Parameter übergeben und zuvor natürlich auf die richtige Weise selber bestimmen.

Bevor 8.2 hast Du zwei Möglichkeiten:

1) Eine Wrapper DLL für LabVIEW in C schreiben die mit Deiner Applikation distribuiert wird und die eigentliche DLL selber dynamisch lädt und zu deren Funktionen linkt.

2) Stelle sicher dass Du die DLL ins Windows Verzeichnis legst auf Deiner Entwickelmaschine und innerhalb des VIs auch dahin verweist. Dann nimmt der Application Builder die DLL nicht mit. Dann musst Du dafür sorgen dass das Directory wo die DLL installiert ist auf allen anderen Rechnern in der PATH environment Variable mitgenommen wird.
Eventuel (aber ohne Gewähr) kannst Du die PATH environment Variable in Ruhe lassen wenn Du den Pfad dieses Directories im INI File Deiner Application als viSearchPath einträgst. Das könnte aber einen Search Dialog beim Starten der Applikation zur Folge haben.

Aber es ist prinzipiel eine schlechte Idee um eine DLL an einem festen Platz zu installieren. Entweder ist sie System global und gehört dann ins Windwos/System32 Directory, mit entsprechenden Vorkehrungen beim Installieren einer Applikation, dass diese Abhängigkeit in der Registry vermerkt wird so dass beim Deinstallieren einer Software die davon Gebrauch macht die DLL nicht auch verschwindet solange eine andere Applikation noch davon Gebrauch macht, oder sie ist applikationsspezifisch und kommt ins Directory dieser Applikation und referenziert die globalen Informationen die mehere Instanzen davon eventuel benötigen aus einer globalen Resource wie etwa der Registry (oder Applikationen oder DLLs die irgendwo installiert sind und in der Registry eingetragen sind so dass Deine applikationsspezifische DLL diese finden kann).

Rolf Kalbermatter

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
19.07.2007, 14:39
Beitrag #7

astraios Offline
LVF-Grünschnabel
*


Beiträge: 44
Registriert seit: Mar 2006

8.5
2006
de

80937
Deutschland
DLLs aus bestimmtem Ordner verwenden nachdem .exe erstellt wurde
Hm. Also an der DLL und der Tatsache, dass die in ihrem Verzeichnis bleiben muss kann ich leider nix ändern - damit muss ich leben. Ich hab's auch nicht geschafft, den App. Builder davon zu überzeugen, die DLL nicht mitzukopieren.

Jetzt hab ich's aber schon soweit: Wenn ich nach der Installation die besagte DLL aus dem Installationsverzeichnisdata lösche, sucht die Appl. beim Start und findet auch die richtige DLL und es geht.

Jetzt hab ich mir nen Trick ausgedacht: Ich bau ne .bat Datei, die nach Abschluss der Installation ausgeführt wird und die DLL löscht. Klappt leider nicht. Die bat wird zwar ausgeführt, aber anscheinend aus einem falschen Verzeichnis... wie kann ich es hinkriegen, dass die bat im richtigen Verzeichnis ausgeführt wird? Ich habe sie so im Projekt, dass Sie direkt im Installationsverzeichnis gespeichert wird. Die bat selbst wechselt dann ins data Verzeichnis und löscht per del Befehl die DLL. Wenn ich sie per Hand ausführe, klappt's - nur eben nicht automatisch nach Abschluss der Installation....

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.07.2007, 08:11 (Dieser Beitrag wurde zuletzt bearbeitet: 21.07.2007 08:12 von rolfk.)
Beitrag #8

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLLs aus bestimmtem Ordner verwenden nachdem .exe erstellt wurde
' schrieb:Hm. Also an der DLL und der Tatsache, dass die in ihrem Verzeichnis bleiben muss kann ich leider nix ändern - damit muss ich leben. Ich hab's auch nicht geschafft, den App. Builder davon zu überzeugen, die DLL nicht mitzukopieren.

Doch das geht, habe ich doch erklärt! Dazu musst Du die DLL aber zumindest für den Build in das Windows oder System Verzeichnis verschieben. Der Applikation Builder nimmt DLLs die von dort aus geladen werden nicht mit in den Build sondern nimmt (was normalerwise korrekt ist) an, dass eine solche DLL auf andere Weise in den Zielrechner gelangt oder Standard dort schon anwesend ist.

Danach musst Du das Directory wo Deine (dumme) DLL liegt auf allen Zielrechnern in die PATH Environment Variable oder eventuel den Deinen INI File Suchpfad eintragen so dass Windows respektive LabVIEW die DLL trotzdem noch finden kann. Das sollte gehen aber LabVIEW Executables können manchmal störrisch sein wenn sie Abhängikeiten nicht perfekt auflösen können.

Ansonsten Upgrade nach 8.20 löst Dir das Problem ganz elegant oder eine Wrapper DLL die Du mit LabVIEW einbinden kannst und die Dir dann dynamisch die richtige DLL lädt und damit linkt.

Andere Möglichkeiten dann die drei obengenannten sehe ich nicht.

Rolf Kalbermatter

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  DLLs kopieren/Bibliothek nicht gefunden ares2013 4 5.514 26.11.2020 17:06
Letzter Beitrag: rolfk
  DLL einbinden die für NEtFramework 4.0 geschrieben wurde Erdberquark 1 6.198 06.02.2012 11:38
Letzter Beitrag: markus321
  verschiedene DLLs über ein Libary Fct Node M@rRy 16 14.356 19.08.2011 12:37
Letzter Beitrag: GerdW
  Mehrere Cuda DLLs Context-Übergabe grey 2 6.128 17.06.2010 19:50
Letzter Beitrag: rolfk
  Konsolenausgabe bei dlls martinv 1 4.269 20.06.2009 06:25
Letzter Beitrag: rolfk
  Eingebundene DLL zieht weitere DLLs an sima 5 8.591 09.12.2008 14:01
Letzter Beitrag: rolfk

Gehe zu: