Skip to main content
gamedev.net
🔒 Locked

Dynamic DLL Help

Started by Squirell 0 replies 350+ views
Original Post
Squirell
Squirell
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;
}


SiCrane
SiCrane
The most common reason for GetProcAddress() failing (at least amoungst people on the forums) is name mangling. In the DLL that you built did you declare the exported function as extern "C" or use a .DEF file to define the exports? If not, the easy solution is to declare the exported function as extern "C".

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.