(C++ using G++) Call a dynamically loaded DLL

February 24, 2017 · View on GitHub

 

 

 

 

 

(C++ using G++) Call a dynamically loaded DLL

 

One of the two ways to call a DLL, the other way is to call a statically loaded DLL.

 

In the two equivalent examples below, the function GetAnswerOfLife is called from the file Functions.DLL and its answer (which should be 42) is checked.

 


#include <windows.h> struct DllHandle {   DllHandle(const char * const filename)     : h(LoadLibrary(filename)) {}   ~DllHandle() { if (h) FreeLibrary(h); }   const HINSTANCE Get() const { return h; }   private:   HINSTANCE h; }; int main() {   //Obtain a handle to the DLL   const DllHandle h("Functions.DLL");   if (!h.Get())   {     MessageBox(0,"Could not load DLL","UnitCallDll",MB_OK);     return 1;   }   //Obtain a handle to the GetAnswerOfLife function   typedef const int (*GetAnswerOfLifeFunction)();   const GetAnswerOfLifeFunction AnswerOfLife     = reinterpret_cast<GetAnswerOfLifeFunction>(       GetProcAddress(h.Get(),"GetAnswerOfLife"));   if (!AnswerOfLife) //No handle obtained   {     MessageBox(0,"Loading AnswerOfLife failed","UnitCallDll",MB_OK);     return 1;   }   if (AnswerOfLife() != 42)   {     MessageBox(0,"Function AnswerOfLife failed","UnitCallDll",MB_OK);     return 1;   }   else   {     MessageBox(0,"Function AnswerOfLife successful!","UnitCallDll",MB_OK);   } }

 

When you look at the GetProcAddress function, you'll note that, unlike C++ Builder, there is no leading underscore added in the function name.

 

 

 

 

 

Building the executable

 

Use the following G++ command:

 


g++ -o Main UnitMain.cpp lm

 

Now start the executable called Main.