2015-07-31 1 views
0

Я хочу, чтобы мои DLL-файлы были в подкаталоге каталога, где находится мой исполняемый файл. Мой текущий каталог выглядит следующим образом:Есть ли исполняемые файлы, отделенные от DLL (это явное связывание?)

Main Folder: [Folder] 
    Program.exe 
    sfml.dll 
    Assets [Folder] 
     Picture.png 
     Music.wav 

Когда я действительно хочу, чтобы это выглядело как:

Main Folder: [Folder] 
    Program.exe 
    Assets [Folder] 
     Picture.png 
     Music.wav 
    MyDlls[Folder] 
     sfml.dll 

Когда я пытаюсь поставить их (DLL) в папке я получаю сообщение об ошибке:

Программа не может запускаться, поскольку на вашем компьютере отсутствует файл sfml-system-d-2.dll. Попробуйте переустановить программу, чтобы исправить эту проблему.

Итак, я посмотрел в явное связывание, и последовал за учебник здесь: http://www.dreamincode.net/forums/topic/118076-dlls-explicit-linking/

Если явное связывание не то, что мне нужно использовать, то, пожалуйста, скажи мне, что мне нужно делать. В противном случае, пожалуйста, скажите мне, что случилось с моим кодом ниже: (Кроме того, я не знаю, если это статическое или динамическое связывание .. ??)

// Startup.h 
#ifndef STARTUP_H 
#define STARTUP_H 

#include <iostream> 
#include <windows.h> 

class Startup 
{ 
private: 
    HINSTANCE hDLL; 
public: 
    // Explicitly link SFML DLL's 
    typedef int(*funcAdd) (int, int); 
    typedef int(*funcSubtract) (int, int); 
    void LoadDLLs() 
    { 
     // Retrieve DLL handle. 
     vector<LPCSTR> libraries = {"openal32.dll", 
            "sfml-audio-2.dll", 
            "sfml-audio-d-2.dll", 
            "sfml-graphics-2.dll", 
            "sfml-graphics-d-2.dll", 
            "sfml-system-2.dll", 
            "sfml-system-d-2.dll", 
            "sfml-window-2.dll", 
            "sfml-window-d-2.dll"}; 
     for (int i = 0; i < libraries.size(); i++) 
     { 
      hDLL = LoadLibrary(libraries[i]); 
      if (hDLL == NULL) 
      { 
        std::cout << "Failed to load library.\n"; 
      } 
      else 
      { 
       funcAdd Add = (funcAdd)GetProcAddress(hDLL, "Add"); 
       funcSubtract Subtract = (funcSubtract)GetProcAddress(hDLL, "Subtract"); 

       if (Add) 
       std::cout << "10+10=" << Add(10, 10) << std::endl; 

       if (Subtract) 
       std::cout << "50-10=" << Subtract(50, 10) << std::endl; 

       FreeLibrary(hDLL); 
       } 
      std::cin.get(); 
     } 
    }; 

#endif 
+0

Есть счастливый промежуточный, активированный '/ DELAYLOAD'. В этом случае функция обратного вызова запускается, когда необходима DLL, которая может загрузить ее из правого каталога. –

ответ

1

Вы можете зарегистрировать App Path (see link), убедившись, что вы добавить свой Применяет альтернативное расположение папки DLL в значение PATH пути приложения.

0

Вы не можете напрямую делать то, что хотите. Код, который вы подключили, будет работать только для динамических загружаемых DLL, но это не так.

То, что вы хотите сделать, будет специфичным для платформы, и перед выполнением программы вам необходимо установить путь к библиотеке.