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