Original Post
I'm trying to implement an interface with a dynamically loading DLL. When I run the code GetProcAdress is returning NULL (not finding the function). What am I doing wrong?
///////////////////////
//In main.cpp
///////////////////////
LoadDevice()
{
Log->LogInfo("Creating device...");
switch(driver)
{
case DT_DIRECTX9:
hDLL = LoadLibrary ("D3DDriver.dll");
if (!hDLL)
{
MessageBox(NULL, "Loading D3DDriver.dll failed.", "Lion Engine - error",
MB_OK | MB_ICONERROR);
return NULL;
}
Log->LogInfo("\tLoaded D3D DLL");
break;
case DT_OPENGL:
hDLL = LoadLibrary ("OpenGLDriver.dll");
if (!hDLL)
{
MessageBox(NULL, "Loading OpenGLDriver.dll failed.", "Lion Engine - error",
MB_OK | MB_ICONERROR);
return NULL;
}
Log->LogInfo("\tLoaded OpenGL DLL");
break;
default:
MessageBox(NULL, "API Unsupported", "Lion Engine - error", MB_OK | MB_ICONERROR);
}
CREATERENDERDEVICE _CreateRenderDevice = NULL;
// pointer to DLL function ‘CreateRenderDevice’
/*_CreateRenderDevice = (CREATERENDERDEVICE)
GetProcAddress(hDLL, "CreateRenderDevice");*/
_CreateRenderDevice = (CREATERENDERDEVICE)::GetProcAddress(hDLL, "CreateRenderDevice");
if (!_CreateRenderDevice )
{
//////////////////////
//I get this error message
///////////////////////
Log->LogError("\tAddress is NULL");
return NULL;
}
Log->LogInfo("\tFound address of function 'CreateRenderDevice'");
// call DLL function to create the device
if(false == _CreateRenderDevice(hwnd, hDLL, &RenderDevice))
{
Log->LogError("\tFailed to create device");
MessageBox(NULL, "CreateRenderDevice() from lib failed.", "Lion Engine - error",
MB_OK | MB_ICONERROR);
RenderDevice = NULL;
return NULL;
}
Log->LogInfo("Device created");
return RenderDevice;
}
///////////////////////////////////////////////
//In a included header file...(IRenderDevice.h)
///////////////////////////////////////////////
#include <windows.h>
//Helper functions to create device from DLL
extern "C"
{
bool CreateRenderDevice(HWND hwnd, HINSTANCE hDLL, IRenderDevice **pInterface);
typedef bool (*CREATERENDERDEVICE) (HWND hwnd, HINSTANCE hDLL, IRenderDevice **pInterface);
bool ReleaseRenderDevice(IRenderDevice **pInterface);
typedef bool(*RELEASERENDERDEVICE) (IRenderDevice **pInterface);
}
#endif //Include guard
/////////////////////////////////////////////////
//In the DLL definitions...(CD3DRenderDevice.cpp)
/////////////////////////////////////////////////
//Defined in IRenderDevice.h
bool CreateRenderDevice( HWND hwnd, HINSTANCE hDLL, IRenderDevice **pDevice )
{
if (!*pDevice )
{
*pDevice = new CD3DRenderDevice(hwnd, hDLL );
return true;
}
return false;
}
bool ReleaseRenderDevice(IRenderDevice **pDevice )
{
if ( !*pDevice )
{
return false;
}
delete *pDevice;
*pDevice = NULL;
return true;
}