Zmiana lokalizacji bibliotek DLL

0

Witam,

Jak można zrobić, aby biblioteki DLL były w podfolderze, a nie w folderze z exe?
Próbowałem tym sposobem, ale za każdym razem program mówił, że nie może znaleźć bibliotek.

SetDllDirectory( "\launcherDLL" );
LoadLibrary( "\launcherDLL\sfml-network-2.dll" );
LoadLibrary( "\launcherDLL\sfml-system-2.dll" );
LoadLibrary( "\launcherDLL\libgcc_s_seh_64-1.dll" );
LoadLibrary( "\launcherDLL\libstdc++_64-6.dll" );

Pozdrawiam.

1

Ale z tego co kojarzę, to jak użyjesz SetDllDirectory to już w LoadLibrary dajesz samą nazwę dll'ki. Ewentualnie możesz pobrać sobie aktualny katalog w którym siedzi plik exe i na jego podstawie utworzyć nową ścieżkę.

Ewentualnie powinno zadziałać od razu bez SetDllDirectory jakbyś dał relatywną ścieżkę.

1

Poza tym sugerowałbym SetDllDirectory(".\\launcherDLL" );
A jeszcze lepiej wyciągnij aktualny folder uruchomionego programu i zapodaj ścieżkę bezwzględna.

0

Zmieniłem na:

SetDllDirectory("launcherDLL");
LoadLibrary("sfml-network-2.dll");
LoadLibrary("sfml-system-2.dll");
LoadLibrary("libgcc_s_seh_64-1.dll");
LoadLibrary("libstdc++_64-6.dll");

Lecz nadal bez skutku. W którym miejscu w kodzie to powinno być? Ja to umieszczam zaraz przed stworzeniem okna głównego.

0
SetDllDirectory(".\\launcherDLL" );

Też nie działa.

A jak mogę wyciągnąć ścieżkę bezwzględną programu?

0
int main(int argc,char *argv[])
  {
    cout<<argv[0]<<endl;
    return 0;
  }
0

Nawet, gdy podałem wszędzie pełne ścieżki nie działa.
Gdzie dokładniej powinno to ładowanie DLL być w kodzie?
Ja to daję zaraz przed stworzeniem okna głównego.

0

Wszytko jedno gdzie w kodzie, grunta aby przed pierwszym użyciem.

0

A że tak zapytam: czy to nie jest tak, że twój program jest zlinkowany z SFML i dlatego wymaga tych bibliotek? Jeśli tak, to dodaj ścieżkę do katalogu z tymi dll-kami do PATHa.

No chyba że rzeczywiście chcesz załadować sobie dllki za pomocą LoadLibrary() (choć nie widać, żeby obchodziły cię uchwyty zwracane przez tą funkcję :) ), a potem planujesz użyć GetProcAddress(), żeby móc wywołać jakieś funkcje z tych dllek.

P.S. Tak mnie naszło o tej możliwości po przeczytaniu tego:
http://en.sfml-dev.org/forums/index.php?topic=15928.0

0
Tomek2 napisał(a):

A że tak zapytam: czy to nie jest tak, że twój program jest zlinkowany z SFML i dlatego wymaga tych bibliotek? Jeśli tak, to dodaj ścieżkę do katalogu z tymi dll-kami do PATHa.

Dokładnie tak jest. :D A jeszcze zapytam, jak się dodaje ścieżkę do PATHa?

0

A nie lepiej byłoby użyć taki sposób

.. //biblioteka.dll

0

Chodzi o to, że ja chciałbym mieć tę dllkę koniecznie w podfolderze. Program ma być wysłany do innych osób tak, żeby u nich też działał. :)

0

Ukośnik na początku oznacza szukanie w katalogu głównym bieżącego dysku.
Kropka na początku oznacza bieżący katalog.
Dwie kropki na początku oznaczają katalog nadrzędny bieżącego katalogu.

Żadne z powyższych nie oznacza „katalog z exekiem”.
Ścieżkę do exeka można go pobrać za pomocą GetModuleFileName.

1

możesz zrobić to tak, że dostarczysz skrypt np. start.cmd, którym będzie się odpalało twój program, a w tym skrypcie będzie coś w tym stylu

set DIR_PATH=%~dp1\moj_podkatalog
set PATH=%PATH%;%DIR_PATH%

start moj_program.exe

Można też napisac osobny program, który będzie odpalał twój, ale najpierw ustawi zmienne. Przykład:
https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms682009%28v=vs.85%29.aspx

w sekcji
Example 2

Altering the environment variables of a child process during process creation...

0
Tomek2 napisał(a):

A że tak zapytam: czy to nie jest tak, że twój program jest zlinkowany z SFML i dlatego wymaga tych bibliotek? Jeśli tak, to dodaj ścieżkę do katalogu z tymi dll-kami do PATHa.
Jeśli mamy statyczne linkowanie to nie widzę powodów do wrzucania gdzieś indziej tych bibliotek. Nie ma co zmieniać zachowania systemu i bawić się w zmienne PATH. Ja sam wszystko wrzucam w katalog z plikami exe i jest ok. Jedyne odstępstwo to są dodatkowe pluginy. Ale one są ładowane dynamicznie poprzez LoadLibrary.

0

Ja osobiście też wrzuciłbym te dll-ki do katalogu programu. Uważam to za najlepsze rozwiązanie, ale cytując autora wątku:

Chodzi o to, że ja chciałbym mieć tę dllkę koniecznie w podfolderze

dlatego właśnie kombinujemy :)

0

Moment, @Krwawy Pomidor, chyba mnie olśniło.
Czy przypadkiem nie jest tak że w programie masz statyczne linkowanie bibliotek, a że zdecydowałeś DLL'ki przesunąć do innego folderu to program przestał działać i próbujesz ten problem naprawić poprzez:
LoadLibrary( ".\\launcherDLL\\sfml-network-2.dll" );
?
Zgadza się?

0
_13th_Dragon napisał(a):

Moment, @Krwawy Pomidor, chyba mnie olśniło.
Czy przypadkiem nie jest tak że w programie masz statyczne linkowanie bibliotek, a że zdecydowałeś DLL'ki przesunąć do innego folderu to program przestał działać i próbujesz ten problem naprawić

Tak ja to zrozumiałem, ale to jest błędne rozwiązanie, bo bieżący katalog to nie to samo co katalog z exekiem. Dałem wyżej wskazówkę: należy użyć GetModuleFileName, skleić właściwą ścieżkę i dopiero użyć LoadLibrary.

1 użytkowników online, w tym zalogowanych: 0, gości: 1