Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

05.09.2010, 16:38

DLL im relativen Pfad

Hallo,

ich hab ne frage, die mich schon länger interessiert.
habe dazu nichts in der suchfunktion gefunden, was mir weiterhilft.

es ist ja so, dass die dll - datein im arbeitsverzeichniss liegen, um erkannt zu werden.
Gibt es auch eine mögligkeit, die dll - files im main - Programm zu laden, so dass man die dll´s in einem relativen pfad zum arbeitsverzeichnis ablegen kann (z.B. Data/dll/ oder Data/bin/)

Habe es schon mit den ladefunktionen LoadLibrary und SDL_GL_LoadLibrary versucht, hab es bis jetzt aber noch nicht hinbekommen.

Liebe Grüße,
Ombalat

2

05.09.2010, 16:42

Dann zeig mal deinen Ansatz mit LoadLibrary ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

3

05.09.2010, 16:43

Normalerweise sollte es auch funktionieren wenn die .dll's im gleichen Verzeichnis wie die .exe liegen.

4

05.09.2010, 17:09

Hallo Ombalat,

vielleicht hilft dir dieser Artikel weiter?!

Gruß
SaRu_

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

05.09.2010, 18:28

Hi,

LoadLibrary ist da ziemlich flexibel. Wenn du einen nicht relativen Pfad angibst wird nur dieser Ordner durchsucht. Ansonsten wird die Suche nach zwei Strategien durchgeführt (je nachdem ob SafeDllSearchMode aktiv ist oder nicht):

SafeDllSearchMode aktiv
  1. Im Applikations directory
  2. Im System directory
  3. 16-Bit System directory
  4. Windows directory
  5. Current directory
  6. Alle Ordner die in der Umgebungsvariable PATH aufgeführt wurden

SafeDllSearchMode nicht aktiv
  1. Im Applikations directory
  2. Current directory
  3. System directory
  4. 16-Bit System directory
  5. WIndows directory
  6. Alle Ordner die in der Umgebungsvariable PATH aufgeführt wurden

Wenn lpFileName zusätzlich ein relativer Pfad ist wird hinter jedem der Suchpfade der relative Pfad angehängt.

Ergo: Laden per relativem Pfad funktioniert. Wenn du dir den Suchmaraton sparen willst kannst du auch über einen direkten Pfad gehen indem du deinen Relativen Pfad per GetFullPathName konvertierst.
@D13_Dreinig

6

05.09.2010, 19:39

Guten Abend!

Dann zeig mal deinen Ansatz mit LoadLibrary ;)

Ich habs so versucht. Die funktion ist zwar erfolgreich (keine Fehlermeldung), beim programmstart meint er aber, die dll nicht zu finden '(habe es erst mal mit einer dll versucht)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "Framework.hpp"
#include <windows.h>
#include "Menue.hpp"

int main(int argc, char *argv[])
{
    SetConsoleTitleA("Way light");
//  ShowWindow(GetConsoleWindow(),SDL_DISABLE);

    //dll´s laden
    if(LoadLibrary(L"Data/bin/fmodex.dll") == NULL)
        cout << "Fehler beim laden der DLL\nError: " << GetLastError() << endl;
 
    if(g_pFramework -> Init(800,600,32,false) == false) //Framework initialisieren
        return 0;
    
    //Menü erstellen und starten
    CMenue Menue;
    Menue.Init();
    Menue.Update();
    Menue.Quit();

    g_pFramework -> Quit(); //Framework hinunterfahren
    return 0;
}


@SaRu: Danke für den Artikel - muss ihn mir noch anschaun ;)

@David_pb: Hab ich dich richtig versanden? Es ist besser, bei der LoadLibrary - funktion den Relativen Pfad in einen absoluten zu konvertieren?

Schönen Abend noch,
Ombalat

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

05.09.2010, 19:42

Müsste es nicht LoadLibrary(L"\\Data\\bin\\fmodex.dll"); heißen?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

05.09.2010, 20:00

@David_pb: Hab ich dich richtig versanden? Es ist besser, bei der LoadLibrary - funktion den Relativen Pfad in einen absoluten zu konvertieren?


Dann ist der Ort für das Modul klar und die Suchstrategie vereinfacht sich dadurch. Ob das besser ist sei dahin gestellt! Ich meine (aus grauer Vorzeit...) zu wissen das dann z.B. keine Module mehr geteilt verwendet- und immer neu geladen werden. ;)

Zitat von »Ombalat«

Ich habs so versucht. Die funktion ist zwar erfolgreich (keine Fehlermeldung), beim programmstart meint er aber, die dll nicht zu finden '(habe es erst mal mit einer dll versucht)


Die Funktion ist erfolgreich? Wann denn, wenn der Aufruf beim Programmstart fehlschlägt?
@D13_Dreinig

9

05.09.2010, 20:39

Irgendwie hab ich den verdacht, du versuchst, etwas zu tun, was nciht geht.
Die fehlermeldung "blabla.dll wurde ncith gefunden" bei Programmstart bedeutet, das windows eine statisch gelinkte dll (eine, die du über die projekteinstellungen einbindest) nicht findet. Diese müssen im selben verzeichniss, oder einem verzeichniss auf dem path liegen.
Dlls, die du mit LoadLibary lädtst, können zwar sonstwo liegen, allerdings kannst du dann auf deren funktionen auch nur mit GetProcAdress zugreifen, sprich, du kannst nciht gegen sie linken, und die entsprechenden header ncith ohne weiteres verwenden (d.h., du kannst das schon, aber dann hast du wieder obige beschränkungen für den ort).
Übrigens frage ich mich, wofür du das eigentlich tust. Wenn du die binaries aus dem hauptverzeichnis haben willst, das spiel aber trotzdem von dort starten willst, tu alle (einschließlich der .exe) in nen unterordner, und pack ins hauptverzeichnis nen launcher (im zweifelsfall ne .bat/.sh). Der muss ja ncihtmal sichtbar werden, er kann auch einfach nur die exe starten.

10

05.09.2010, 22:04

Ich hab mich geirrt, die funktion ist doch nicht erfolgreich - sie erreicht nur den if block nicht, weil er vorher die fehlermeldung ausspuckt.

@PCShadow: Da könnte was dran sein ... Aber in den Projekt einstellungen stehen ja nur die .lib unter weitere abhängigkeiten oder so drinnen
Ist es dann überhaupt möglich, die dll in einem anderen pfad abzulegen (nicht bei der exe)?
Weil über nen launcher ist es auch nicht das wahre (und ich wüsst auch nicht, wie man das machen sollte ;))

Werbeanzeige