DonDaDev
DonDaDev

Reputation: 291

Have Executable Separated From DLL's (Is That Explicit Linking?)

I want to have my DLL's in a subdirectory of the directory where my executable is. My current directory looks like:

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

When I really want it to look like:

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

When I try to put them (DLL's) in a folder I get the error message:

The program can't start because sfml-system-d-2.dll is missing from your computer. Try reinstalling the program to fix this problem.

So, then I looked into explicit linking, and followed the tutorial here: http://www.dreamincode.net/forums/topic/118076-dlls-explicit-linking/

If explicit linking is not what I need to use, then please tell me what I need to do. Else, please tell me what is wrong with my code below: (Also, I do not know if this is static or dynamic 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

Upvotes: 0

Views: 77

Answers (2)

LeDYoM
LeDYoM

Reputation: 980

You cannot do what you want directly. The code you attached will work only for dynamic loading dlls, but it is not the case.

What you want to do will be platform specific and you need to set the path for the library before executing the program.

Upvotes: 0

Bukes
Bukes

Reputation: 3718

You could register an App Path (see link), making sure you add your Applications alternate DLL folder location to the App Path PATH value.

Upvotes: 1

Related Questions