Autor Wątek: Zmiana położenia dynamicznym bibliotek  (Przeczytany 1534 razy)

Offline Elektryk

  • Użytkownik

# Lipiec 31, 2011, 14:14:07
Witam,
korzystam z Visual Studio 2010 Prof. na Windows 7 i w swoim projekcie używam biblioteki SFML. Pliki biblioteki dołączam dynamicznie tzn poprzez DLL. I aby program działał to muszę te pliki wrzucić do folderu z program. Moje pytanie brzmi: czy da się skonfigurować coś w właściwościach projektu aby DLLe były linkowane z innego, głębszego folderu?

To znaczy jeśli program uruchamiam spod adresu:
C:/Program/plik.exe

to przykładowy plik DLL od SFML musi być pod adresem:
C:/Program/sfml-graphics.dll

A ja chciałbym aby był pod adresem:
C:/Program/data/bin/sfml-graphics.dll

Ktoś wie jak to zrobić?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Charibo

  • Redaktor

# Lipiec 31, 2011, 14:32:28
Podajesz inną ścieżkę do LoadLibrary :)

Offline Elektryk

  • Użytkownik

# Lipiec 31, 2011, 14:43:38
Ale ja nie używam WinApi. Stworzyłem program na bazie aplikacji konsolowej.
Czy aby dokonać tej zmiany muszę więc zmienić rodzaj aplikacji czy jest jakieś inne wyjście?

Offline hashedone

  • Użytkownik

# Lipiec 31, 2011, 14:46:30
Najprościej i najwygodniej - utworzyć w folderze aplikacji skrót i zmienić mu Working Directory. Ma to jednak wady. Innego rozwiązania nie znam.

Offline Elektryk

  • Użytkownik

# Lipiec 31, 2011, 14:48:11
Ma taką wadę, że nic to nie daje. Mi chodzi własnie o to aby obok pliku .exe był tylko jeden folder data.

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Lipiec 31, 2011, 14:51:48
Ale ja nie używam WinApi.

Jak to nie? Piszesz program dla Windows, więc używasz. Możesz bez problemu wywołać każdą funkcję WinAPI jaką chcesz, również w aplikacji konsolowej.

Offline hfjh

  • Użytkownik

# Lipiec 31, 2011, 14:54:50
A dodanie ścieżki do DLL do zmiennej systemowej Path wchodzi w grę?

Offline Charibo

  • Redaktor

# Lipiec 31, 2011, 15:12:00
Używasz, skoro ładujesz .dll-ki :) One są stricte windowsowe. Możesz ewentualnie dołączać je niejawnie, przez podanie odpowiedniego .lib-a w opcjach projektu, albo przez #pragma comment (lib, ..). Ale nie jestem w stanie wyobrazić sobie potrzeby ukrywania ich wtedy przed użytkownikiem:) 

Trochę poszukałem i może pomoże kombinacja delayed dll loading i tej funkcji przed pierwszym wywołaniem SMFL-a :)

Offline Elektryk

  • Użytkownik

# Lipiec 31, 2011, 15:35:43
Zmienna środowiskowa Path nie wchodzi w grę ponieważ to ma działać niezależnie od nazwy folderu instalacji.
Ok. Z tym WinApi to był mój błąd. Na szczęście udało mi się z udziałem waszej pomocy rozwiązać to zagadnienie. Gdyby ktoś szukał jak zmienić położenie DLLek to tłumaczę:

1. Przechodzimy do Projekt>Właściwości projektu>Właściwości konfiguracji>Linker>Input i w pole Delay loaded Dlls wpisujemy listę bibliotek które chcemy trzymać w innym folderze. W moim przypadku aktualnie jest to sfml-window.dll;sfml-system.dll;sfml-graphics.dll;.

2. W kodzie przed pierwszym użyciem bibliotek dopisujemy linijkę SetDllDirectory( TEXT("data/bin")); gdzie zamiast data/bin trzeba podać ścieżkę do DLLek z punktu widzenia pliku .exe. To TEXT() jest tam aby Visual nie rzucał się o typ argumentu.

3. Na górze tego samego pliku dopisujemy #include <windows.h> jeśli jeszcze tam tego nie mamy.

Dzięki za pomoc. Zwłaszcza dla Charibo i Złośliwca.
« Ostatnia zmiana: Lipiec 31, 2011, 15:41:46 wysłana przez Elektryk »