Basicamente es para que la gente vea como hacer un sistema de drivers para su motor/juego, etc.
Este es un ejemplo de como conseguir cargar la implementacion de una clase de una dll de esta manera con muy pocos cambios conseguir por ejemplo renderizar con OpenGL Direct3d o cualquier otra API sin tener que cambiar ni una linea de codigo.
Aunque aqui se muestra como ejemplo un driver de video se puede aplicar a otros sistemas como AI, sonido...
Si quieres ver implementaciones de este tipo en el codigo fuente del quake o del unreal puedes ver como se usa este sistema.
//////////////////////////////////////////////////////////////////////
// Video.h: interface for Video DLLs
// Common Use
//////////////////////////////////////////////////////////////////////
#if !defined(TVideoDriver__INCLUDED_)
#define TVideoDriver__INCLUDED_
// this is actually our interface, i added only a few functions
struct TVideoDriver
{
// get driver name
virtual void getName(char* strOut);
// init the driver
virtual BOOL initialize(HWND window);
// finish the driver
virtual BOOL finalize();
// setup the driver
virtual BOOL setup();
// begin a frame
virtual BOOL beginFrame();
// end a frame
virtual BOOL endFrame();
// open the driver for rendering
virtual BOOL openVideo(HWND renderWindow);
// close the driver for rendering
virtual BOOL closeVideo();
};
// the only function that a driver must export
typedef TVideoDriver*(*ptrFuncGetVideoDriver)();
#endif // !defined(TVideoDriver__INCLUDED_)
//////////////////////////////////////////////////////////////////////
// main.cpp: dll main
// This in CustomDriver.Dll
//////////////////////////////////////////////////////////////////////
// just the driver object
CCustomVideoDriver driver;
// return a cast to the interface
extern "C" __declspec(dllexport) TVideoDriver* getVideoDriver()
{
return (TYakVideoDriver*) &
}
//////////////////////////////////////////////////////////////////////
// CustomVideoDriver.h: Declaration of our driver
// This in CustomDriver.Dll
//////////////////////////////////////////////////////////////////////
class CCustomVideoDriver : public TYakVideoDriver
{
public:
// driver interfaces
void getName(char* strOut);
BOOL initialize(HWND window);
BOOL finalize();
BOOL setup();
BOOL beginFrame();
BOOL endFrame();
BOOL openVideo(HWND renderWindow);
BOOL closeVideo();
// custom data, just a posible example
private:
D3D9TextureManager* pManager;
}
//////////////////////////////////////////////////////////////////////
// CustomVideoDriver.cpp: Code of our driver (just example)
// This in CustomDriver.Dll
//////////////////////////////////////////////////////////////////////
BOOL CCustomVideoDriver::initialize(HWND window)
{
return initD3D9(); // and so on
}
//////////////////////////////////////////////////////////////////////
// DriverManager.h: Manage the drivers
// This in our game.exe
//////////////////////////////////////////////////////////////////////
class CVideoManager
{
public :
BOOL loadDriver(char* fileName);
BOOL unloaDriver();
inline TYakVideoDriver* getDriver(){return driver;}
private :
HMODULE libraryHandle;
TYakVideoDriver* driver;
}
//////////////////////////////////////////////////////////////////////
// DriverManager.cpp: Manage the drivers
// This in our game.exe
//////////////////////////////////////////////////////////////////////
BOOL CVideoManager::loadDriver(char* fileName)
{
BOOL result = TRUE;
libraryHandle = LoadLibrary(fileName);
if (libraryHandle != NULL)
{
ptrFuncGetVideoDriver funcGetDriver =(ptrFuncGetVideoDriver)
GetProcAddress(libraryHandle, "getVideoDriver");
if (funcGetDriver != NULL)
driver = funcGetDriver();
else
result = FALSE;
}
else
{
result = FALSE
driver = NULL;
}
return result;
}
//////////////////////////////////////////////////////////////////////
// game.cpp: Some code to see how we could use it
// This in our game.exe
//////////////////////////////////////////////////////////////////////
void game()
{
videoManager.getDriver()->OpenVideo(mainWindow);
}
Éste código fue enviado por mICrO.
Si quieres enviar tu propio código hazlo a eth_cotd@lycos.es
He añadido algunos comentarios, micro no ha puesto demasiados y aunque a los q lleven un tiempo programando les sonara esta forma de cargar la implementacion de una libreria en tiempo de ejecucion, a otros les puede sonar a chino y mas si no estan muy familiarizados con c++.
Hay tutoriales de como usar este sistema en flicpode y como no, en google.com :D
Esta semana ha sido la primera q he podido elegir cotw mucha gracias a los q han enviado codigos, todos de muy buena calidad.
saludos
Hay algo parecido en FlipCode:
http://www.flipcode.com/cgi-bin/msg.cgi?sh...orum=cotd&id=-1, aunque está enfocado a DirectX.
ZaelSiuS:
No se refiere a eso exactamente, mas bien lo mas parecido es este codigo mega-ofsucado :
http://www.flipcode.com/cgi-bin/msg.cgi?sh...orum=cotd&id=-1
Magnifico codigo, si señor!
¡Oh gracias gran maestro micro, por compartir tu sabiduria con nosotros, seguramente este codigo me salvara la vida!
El codigo es casi tan bueno como MI Pekechat que tambien se puede pillar en este foro. Asi que ya lo estais probando XDDD ;)
Bueno trabajo maetro micro 8)