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