2013-07-02 19 views
5

Jestem nowy w "ukrytych/ciemnych miejscach" C++ i zastanawiałem się, jak załadować plik .dll z innego katalogu lub podkatalogu wewnątrz tego, w którym działa mój bieżący plik wykonywalnyC++ Załaduj bibliotekę DLL z podkatalogu?

Ex :

./MyAppDirectory 
    /MyApp.exe 
    /SomeDLL.dll 
    /AnotherDLL.dll 
    /SubDirectory 
    /SomeDLL2.dll 
    /AnotherDLL2.dll 
    /YetAnotherDLL.dll 
    /... 

So "MojaAplik.exe" automatycznie wczytuje "SomeDLL.dll" i "AnotherDLL.dll" ze jest to folder główny "MyAppDirectory", jednak ja też chce być w stanie załadować "SomeDLL2.dll", " AnotherDLL2.dll "," YetAnotherDLL.dll "itp. Z folderu" SubDirectory "w folderze" MyAppDirectory ".

Robiłem kilka wyszukiwań iz tego co znalazłem to jedyne rozwiązania to:

  • 1) Zmienić katalog roboczy wykonywalnego.
  • 2) Umieść pliki DLL wewnątrz katalogu głównego systemu Windows.
  • 3) Zmodyfikuj zmienną środowiskową PATH.

Ale wszystkie mają pewne złe strony (nie warto tu wspomnieć) i to nie jest to, czego naprawdę potrzebuję. Kolejnym rozwiązaniem jest "Ścieżki specyficzne dla aplikacji!" co wymaga pracy z rejestrem Windows i wydaje się być nieco lepsze niż te wymienione wcześniej.

Muszę jednak móc to zrobić w "MyApp.exe" używając C++ bez potrzeby korzystania z zewnętrznych metod.

Używam MinGW 4.7.2, a moim IDE jest Code :: Blocks 12.11 również mój system operacyjny to Windows XP SP3 Pro x86.

Wszelkie odniesienia, poradnik, dokumentacja, przykład itp jest akceptowana i dziękuję za poświęcony czas: D

+0

Wszystkie trzy wyszczególnione listy są złymi pomysłami. Nie rób tego. –

+0

możliwy duplikat [Altering DLL path wyszukiwania dla statycznie połączonych bibliotek DLL] (http://stackoverflow.com/questions/3832290/altering-dll-search-path-for-static-linked-dll) – MSalters

Odpowiedz

2

jeśli nie są wyraźnie ładuje DLL („ręcznie”, w kodzie przy użyciu LoadLibrary(...)), to trzeba mieć .dll w miejscu, że system Windows będzie szukał DLL, delfinarium dość dużo znaczy jeden z trzech opcji, o których mówisz w swoim pytaniu.

Podczas korzystania z LoadLibrary można podać względną lub bezwzględną ścieżkę do biblioteki DLL.

Należy pamiętać, że jest to zupełnie inna załadować DLL jawnie i niejawnie - w wyraźnej przypadku trzeba użyć LoadLibrary, a następnie użyj GetProcAddress znaleźć adres funkcji i będzie trzeba użyć wskaźników funkcji zadzwonić funkcje - jest to zwykle używane tylko w przypadku wtyczek lub podobnych funkcji, w których biblioteka DLL udostępnia niewielką liczbę funkcji (często jest to tylko funkcja fabryczna do tworzenia obiektów, które mają typową klasę interfejsu, a każda biblioteka DLL ma taki sam typ funkcji, aby stworzyć obiekt do robienia wszystkiego, co powinien).

W przypadku obciążenia niejawnego nie trzeba wykonywać żadnych czynności w kodzie, aby korzystać z biblioteki DLL, a funkcje z biblioteki DLL wyglądają tak, jakby były trudne do połączenia z aplikacją.

+0

Bardzo dziękuję za przedłużoną odpowiedź, która odpowiedziała na moje pytanie: D –

+0

Jeśli to odpowie na twoje pytanie, proszę oznaczyć je jako takie. –

+0

Przepraszamy za błąd. Zostałem rozproszony przez kogoś podczas dalszego dokumentowania twojej odpowiedzi i zapomniałem potwierdzić. –

0

Należy użyć

LoadLibrary("subFolder\\dynamicLibrary.dll"); 

To wyraźne powiązanie do DLL, to jest nieco trudniejsze niż domniemane powiązanie (myślę, że to jest to, czego używasz), ale uważam, że jest to właściwy sposób, aby osiągnąć swój cel

explicit

implicit

+0

Czy ta metoda jest specyficzna dla MSVC lub mogę go używać w innych kompilatorach, takich jak MinGW (gcc)? –

+0

To jest interfejs WinAPI, więc można go używać w każdym kompilatorze, wystarczy dołączyć i link Kernel32.lib Oczywiście działa tylko w systemie Windows –

+0

Nie. Powinieneś użyć bezwzględnej ścieżki. –