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!
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?
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)
17.07.2007, 09:50 (Dieser Beitrag wurde zuletzt bearbeitet: 17.07.2007 09:50 von Lucki.)
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.
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 :-(
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).
19.07.2007, 08:38 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2007 08:49 von rolfk.)
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).
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....
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.