static InterfaceReg *s_pInterfaceRegs;bbs.mypm.net
};www.mypm.net
并定义了两个函数指针和一个函数项目管理者联盟
#define CREATEINTERFACE_PROCNAME "CreateInterface"training.mypm.net
typedef void *(CreateInterfaceFn)( const char *pName , int *pReturnCode );www.mypm.net
typedef void *(InstantiateInterfaceFn)( void );项目管理者联盟
DLL_EXPORT void *CreateInterface( const char *pName , int *pReturnCode );bbs.mypm.net
下面看看它如何通过宏来建立链表pmp.mypm.net
#define EXPOSE_INTERFACE( className , interfaceName , versionName ) \项目管理者联盟
static void *__Create##className##_Interface() { return (interfaceName*) new className; } \
static InterfaceReg __g_Create##interfaceName##_Reg( __Create_##className##_Interface , versionName );项目管理者联盟
如果你有一个类CPlayer它想对外暴露接口IPlayer,那么很简单,可以这么做talent.mypm.net
#define PLAYER_VERSION_NAME "IPlayer001"项目管理者联盟
EXPOSE_INTERFACE( CPlayer , IPlayer , PALYER_VERSION_NAME );club.mypm.net
如果在其他模块内你需要获得这个接口,可以这么做项目管理者联盟
CreateInterfaceFn factory = reinterpret_c ast (GetProcAddress( hDLL , CREATEINTERFACE_PROCNAME ));项目管理者联盟
IPlayer player = factory( PLAYER_VERSION_NAME , 0 );项目管理者联盟
其中hDLL为模块的句柄。这里函数指针factory实际指向模块内部的CreateInterface函数,这个函数通过比较传入的接口名从链表找到指定类指针。项目管理者联盟
解决了类厂问题,下面让我们看看如何建立模块对外的接口,在Game Programming Gems3的《一个基于对象组合的游戏架构》一文提出了一种架构,Half Life2引擎中对这种架构进行了有效的扩展,你可以让所有的对外暴露的接口都使用这个架构,前提是模块只有一个接口对外暴露。项目管理者联盟
class IAppSystem项目管理者联盟
{training.mypm.net
public:项目管理者联盟
// Here's where the app systems get to learn about each other项目管理者联盟
virtual bool Connect( CreateInterfaceFn factory ) = 0;项目管理者联盟
virtual void Disconnect() = 0;项目管理培训
|