131 lines
2.9 KiB
C
131 lines
2.9 KiB
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
//导出给脚本使用的对象的基类
|
|||
|
|
//引用计数生命期自动管理类,禁止对此类调用delete,不用时应当调用release。
|
|||
|
|
class CBaseScriptExportObject
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
CBaseScriptExportObject() {
|
|||
|
|
m_nRefCount = 0;
|
|||
|
|
m_sObjectName[0] = 0;
|
|||
|
|
}
|
|||
|
|
//增加引用计数,函数返回增加后的引用计数。
|
|||
|
|
virtual int addRef(){ m_nRefCount++;return m_nRefCount;}
|
|||
|
|
|
|||
|
|
//减少引用计数,函数返回减少后的引用计数。如果计数减少为0则函数销毁对象自己
|
|||
|
|
virtual int release() {
|
|||
|
|
int nRet = --m_nRefCount;
|
|||
|
|
if (nRet <= 0)
|
|||
|
|
destroy();
|
|||
|
|
return nRet;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments: 销毁实体
|
|||
|
|
* @Return void:
|
|||
|
|
*/
|
|||
|
|
virtual void destroy() = 0;
|
|||
|
|
|
|||
|
|
inline int getRef() const { return m_nRefCount; }
|
|||
|
|
inline virtual const char* getClassName() const { return CBaseScriptExportObject::m_sClassName; }
|
|||
|
|
|
|||
|
|
inline void SetObjectName(LPCTSTR name)
|
|||
|
|
{
|
|||
|
|
if (name)
|
|||
|
|
{
|
|||
|
|
size_t nLen = __min(_tcslen(name), 31);
|
|||
|
|
memcpy(m_sObjectName, name, nLen * sizeof(TCHAR));
|
|||
|
|
m_sObjectName[nLen] = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
m_sObjectName[0] = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
inline const TCHAR* GetObjectName() const { return m_sObjectName; }
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
//~CBaseScriptExportObject(){}
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
int m_nRefCount; // 引用计数,构造时必须为1
|
|||
|
|
static TCHAR m_sClassName[32]; // 该类的名称,用于脚本导出
|
|||
|
|
TCHAR m_sObjectName[32]; // 脚本对象名称,用于析构时从全局对象管理器中清除此对象
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
class GlobalObjectMgr
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
static GlobalObjectMgr& getSingleton()
|
|||
|
|
{
|
|||
|
|
return *sGlobalObjectMgr;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void initialize();
|
|||
|
|
|
|||
|
|
static void uninitialize();
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments:设置全局对象,
|
|||
|
|
* Param const char * pName: 变量名称
|
|||
|
|
* Param void * object: 对象指针,如果为空则表示移除此变量
|
|||
|
|
* @Return bool:成功返回true;失败返回false。如果有重名的变量,返回失败。
|
|||
|
|
*/
|
|||
|
|
bool SetGlobalObject(const char *pName, void *object)
|
|||
|
|
{
|
|||
|
|
if (!pName) return false;
|
|||
|
|
|
|||
|
|
if (!object)
|
|||
|
|
{
|
|||
|
|
m_Objects.remove(pName);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
void **pItem = m_Objects.get(pName);
|
|||
|
|
if (pItem) return false;
|
|||
|
|
|
|||
|
|
pItem = m_Objects.put(pName);
|
|||
|
|
if (pItem)
|
|||
|
|
{
|
|||
|
|
*pItem = object;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments: 获取全局对象
|
|||
|
|
* Param const char * pName: 对象名称
|
|||
|
|
* @Return void*: 如果对象存在,返回对象指针。如果对象不存在,返回NULL
|
|||
|
|
*/
|
|||
|
|
void* GetGlobalObject(const char *pName)
|
|||
|
|
{
|
|||
|
|
if (!pName || strlen(pName) == 0) return NULL;
|
|||
|
|
void **pItem = m_Objects.get(pName);
|
|||
|
|
if (pItem)
|
|||
|
|
return *pItem;
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool RemoveObject(const char *pName)
|
|||
|
|
{
|
|||
|
|
if (!pName || strlen(pName) == 0) return false;
|
|||
|
|
|
|||
|
|
return m_Objects.remove(pName) >= 0 ? true : false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ClearGlobalObject(const char *pName)
|
|||
|
|
{
|
|||
|
|
if (pName)
|
|||
|
|
m_Objects.remove(pName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static GlobalObjectMgr *sGlobalObjectMgr;
|
|||
|
|
static LONG sGlobalObjectMgrCount;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
CCustomHashTable<void*> m_Objects;
|
|||
|
|
};
|