(C++ Builder) Call a dynamically loaded DLL in C++ Builder
February 24, 2017 · View on GitHub
(C++ Builder) Call a dynamically loaded DLL in C++ Builder
Calling a dynamically loaded DLL is 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 ProjectDll.DLL and its answer (which should be 42) is checked.
Example #0: Using a struct
My favorite and more exception safe solution.
//From http://www.richelbilderbeek.nl/CppBuilderCallDllDynamic.htm #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("ProjectDll.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 C++ Builder add a leading underscore in the function name.
Example #1: Without using a struct
//From http://www.richelbilderbeek.nl/CppBuilderCallDllDynamic.htm #include <windows.h> int main() { //Obtain a handle to the DLL const HINSTANCE dllHandle = LoadLibrary("ProjectDll.DLL"); if (!dllHandle) { 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(dllHandle,"_GetAnswerOfLife")); if (!AnswerOfLife) //No handle obtained { MessageBox(0,"Loading AnswerOfLife failed","UnitCallDll",MB_OK); FreeLibrary(dllHandle); return 1; } if (AnswerOfLife() != 42) { MessageBox(0,"Function AnswerOfLife failed","UnitCallDll",MB_OK); FreeLibrary(dllHandle); return 1; } else { MessageBox(0,"Function AnswerOfLife successful!","UnitCallDll",MB_OK); FreeLibrary(dllHandle); } }
When you look at the GetProcAddress function, you'll note that C++ Builder add a leading underscore in the function name.