Dll Verzeichnis

06/04/2014 03:41 Hiris#1
Hoi, wahrscheinlich eine retardete Frage aber ich such jetzt ne halbe Ewigkeit nach der Option und google spuckt auch nichts aus.

IDE: Visual Studios 2012 Ultimate

-> Ich hab eine non-static library das heißt im Release Ordner muss die entsprechende dll Datei dazu sein. Ich hab da so einen Tick und würde die Dll´s ungern ins Rootverzeichnis packen sondern einfach in ein Unterverzeichnis ala "Binaries" das im Root Ordner ist.

Da muss es doch irgendwo in den Projekteinstellungen eine Option geben mit der man angeben kann, dass die Exe dort danach suchen soll oder? :D
06/04/2014 05:47 iTrodan#2
Ich glaube nicht, dass so etwas möglich ist.
06/04/2014 07:39 snow#3
Eine Suchanfrage später: [Only registered and activated users can see links. Click Here To Register...] - entweder den Pfad direkt hinzufügen oder die globale Umgebungsvariable anpassen.
06/04/2014 12:22 Tyrar#4
Alternativ würde ich sagen, dass man die Imports hinterher löscht und beim Start manuell laden lässt. Eben aus dem jeweiligen Verzeichnis.
06/04/2014 17:22 MrSm!th#5
Ob es in nativen Dlls bzw. in den Projekteinstellungen geht, weiß ich nicht. In .NET Dlls kann man derartige Informationen hinterlassen, wenn ich mich recht erinnere.

Generell sucht Windows im Windowsverzeichnis, im system32 Ordner, im aktuellen Verzeichnis (Working Directory) und im Verzeichnis der ausführbaren Datei nach Abhängigkeiten und lässt da nur wenig Konfiguration zu.

@snow
Es geht nicht um das Hinterlegen in VS. Er möchte sein Programm anscheinend mit einer bestimmten Ordnerstruktur ausliefern.

Um mal meine bescheidene Meinung dazu abzugeben:
Das ist Unsinn. Die Abhängigkeiten gehören in das Verzeichnis des Programms. Habe ich auch noch nie anders gesehen. msvcXXX.dll und der ganze Kram sind immer im selben Ordner wie das Programm.
Allenfalls für sich stehende Komponenten wie Anti-Cheat Software bekommen ihre eigenen Ordner, aber die werden dann auch sowieso manuell geladen, wie Tyrar es vorgeschlagen hat.
Spar dir die Mühe einfach, das ist die höchstwahrscheinlich auftretenden Kopfschmerzen nicht wert.
06/04/2014 18:22 Hiris#6
@Snow siehe Smith^^

Hrmm, eine unschöne aber auch machbare Alternative wäre in das "rootverzeichnis" eine 2.te Exe zu packen die die echte .exe im Unterverzeichnis mit den Dll´s ausführt, aber ja, ich denk ich werds auch sein lassen, danke für die Antworten ;)
06/04/2014 21:35 MrSm!th#7
Wenn du sowieso bereit wärst, einen Launcher zu verwenden, kannst du den auch einfach das Working Directory setzen lassen (ein Parameter von CreateProcess).
06/04/2014 23:05 Master674b#8
Dafür gibt es [Only registered and activated users can see links. Click Here To Register...].

Der Haken: Muss passieren, vor die Imports resolved werden. Also praktisch nicht verwendbar für normale Anwendungen, außer du machst eine fast leere Anwendung (als Launcher) und lässt diese nur ein Modul laden in dem das ganze Zeug der Anwendung drin ist und zuvor machst du den SetDllDirectory Aufruf.
06/05/2014 01:10 dasschild#9
Quote:
Originally Posted by Master674b View Post
Dafür gibt es [Only registered and activated users can see links. Click Here To Register...].

Der Haken: Muss passieren, vor die Imports resolved werden. Also praktisch nicht verwendbar für normale Anwendungen, außer du machst eine fast leere Anwendung (als Launcher) und lässt diese nur ein Modul laden in dem das ganze Zeug der Anwendung drin ist und zuvor machst du den SetDllDirectory Aufruf.
So würde ich das auch machen nur gibt es da einen Trick. Man kann einen Prozess suspended erstellen. Heißt man erstellt sich einen kleinen Loader und erstellt den Prozess suspended(-> angehalten). Jetzt benutzt man CreateRemoteThread um den Dll Path zu setzen und resumed(-> fortsetzen) den Main Thread(-> in der Struct aus CreateProcess). Natürlich lässt sich der Sinn wiederfragen nur wenn man mit Libs wie Qt arbeitet ist dies sehr sinnvoll.

Die Working Directory würde zusätzlichen Aufwand in der App. erfordern. Ein Launcher könnte static progammiert werden z.B. durch laden von Ini oder Json Dateien.
06/05/2014 02:44 MrSm!th#10
Working Directory lässt sich genau so einfach über einen Launcher setzen.
Fakt ist, natürlich gibt es Wege, aber sie verlangen alle mehr Aufwand als es eigentlich wert ist. Und jeder mir bekannte Weg (wenn es nicht total dreckig und hacky werden soll) verlangt einen Launcher.
06/05/2014 11:08 Tyrar#11
Quote:
Originally Posted by MrSm!th View Post
Working Directory lässt sich genau so einfach über einen Launcher setzen.
Fakt ist, natürlich gibt es Wege, aber sie verlangen alle mehr Aufwand als es eigentlich wert ist. Und jeder mir bekannte Weg (wenn es nicht total dreckig und hacky werden soll) verlangt einen Launcher.
Nunja, eine alternative die mir noch einfallen würde wäre das löschen der IAT und diese dann hinterher über einen kleinen Stub neu zu mappen, dem Namen das Modules allerdings noch einen Pfad vor zu hängen.
Ob sich das lohnen würde ist natürlich wieder eine andere Frage. (Sowas ähnliches hatte ich letztens erst, aber nur um die Abhängigkeiten in einem anderen Verzeichnis zu haben würde ich nicht so weit gehen!)

Im gesamten also ähnlich wie die vorher von mir vorgeschlagene Methode, nur eben voll automatisch. Ich glaube ich bastel dazu gleich noch was passendes...