Files
wnmj/Servers/全局定义/Module.h
2026-02-13 14:34:15 +08:00

361 lines
9.6 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef MODULE_HEAD_FILE
#define MODULE_HEAD_FILE
//////////////////////////////////////////////////////////////////////////////////
//模块接口
#define VER_IUnknownEx INTERFACE_VERSION(1,1)
static const GUID IID_IUnknownEx={0x5feec21e,0xdbf3,0x46f0,0x9f,0x57,0xd1,0xcd,0x71,0x1c,0x46,0xde};
//基础接口
interface IUnknownEx
{
//释放对象
virtual VOID Release()=NULL;
//接口查询
virtual VOID * QueryInterface(REFGUID Guid, DWORD dwQueryVer)=NULL;
};
//////////////////////////////////////////////////////////////////////////////////
//版本比较
//产品版本
#define BULID_VER 0 //授权版本
#define PRODUCT_VER 6 //产品版本
//接口版本
#define INTERFACE_VERSION(cbMainVer,cbSubVer) \
(DWORD)( \
(((BYTE)(PRODUCT_VER))<<24)+ \
(((BYTE)(cbMainVer))<<16)+ \
((BYTE)(cbSubVer)<<8))+ \
((BYTE)(BULID_VER))
//模块版本
#define PROCESS_VERSION(cbMainVer,cbSubVer,cbBuildVer) \
(DWORD)( \
(((BYTE)(PRODUCT_VER))<<24)+ \
(((BYTE)(cbMainVer))<<16)+ \
((BYTE)(cbSubVer)<<8)+ \
(BYTE)(cbBuildVer))
//产品版本
inline BYTE GetProductVer(DWORD dwVersion)
{
return ((BYTE *)&dwVersion)[3];
}
//主要版本
inline BYTE GetMainVer(DWORD dwVersion)
{
return ((BYTE *)&dwVersion)[2];
}
//次要版本
inline BYTE GetSubVer(DWORD dwVersion)
{
return ((BYTE *)&dwVersion)[1];
}
//编译版本
inline BYTE GetBuildVer(DWORD dwVersion)
{
return ((BYTE *)&dwVersion)[0];
}
//版本比较
inline bool InterfaceVersionCompare(DWORD dwQueryVer, DWORD dwInterfaceVer)
{
if (GetSubVer(dwQueryVer)>GetSubVer(dwInterfaceVer)) return false;
if (GetMainVer(dwQueryVer)!=GetMainVer(dwInterfaceVer)) return false;
if (GetBuildVer(dwQueryVer)!=GetBuildVer(dwInterfaceVer)) return false;
if (GetProductVer(dwQueryVer)!=GetProductVer(dwInterfaceVer)) return false;
return true;
};
//////////////////////////////////////////////////////////////////////////////////
//内部接口查询
//查询接口
#define QUERYINTERFACE(Interface,Guid,dwQueryVer) \
if ((Guid==IID_##Interface)&&(InterfaceVersionCompare(dwQueryVer,VER_##Interface))) \
return static_cast<Interface *>(this);
//查询接口
#define QUERYINTERFACE_IUNKNOWNEX(BaseInterface,Guid,dwQueryVer) \
if ((Guid==IID_IUnknownEx)&&(InterfaceVersionCompare(dwQueryVer,VER_IUnknownEx))) \
return static_cast<IUnknownEx *>(static_cast<BaseInterface *>(this));
//////////////////////////////////////////////////////////////////////////////////
//外部接口查询
//查询接口
#define QUERY_ME_INTERFACE(Interface) \
((Interface *)QueryInterface(IID_##Interface,VER_##Interface))
//查询接口
#define QUERY_OBJECT_INTERFACE(Object,Interface) \
((Interface *)Object.QueryInterface(IID_##Interface,VER_##Interface))
//查询接口
#define QUERY_OBJECT_PTR_INTERFACE(pObject,Interface) \
((pObject==NULL)?NULL:((Interface *)pObject->QueryInterface(IID_##Interface,VER_##Interface)))
//////////////////////////////////////////////////////////////////////////////////
//组件模板辅助模板
//组件创建函数
typedef VOID * (ModuleCreateProc)(REFGUID Gudi, DWORD dwInterfaceVer);
//组件辅助类模板
template <typename IModeluInterface> class CTempldateHelper
{
//接口属性
public:
REFGUID m_Guid; //接口标识
const DWORD m_dwVersion; //接口版本
//组件属性
public:
CHAR m_szCreateProc[32]; //创建函数
TCHAR m_szModuleDllName[MAX_PATH]; //组件名字
//内核变量
public:
HINSTANCE m_hDllInstance; //DLL 句柄
IModeluInterface * m_pIModeluInterface; //模块接口
//辅助变量
public:
TCHAR m_szDescribe[128]; //错误描述
//函数定义
public:
//构造函数
CTempldateHelper(REFGUID Guid, DWORD dwVersion);
//构造函数
CTempldateHelper(REFGUID Guid, DWORD dwVersion, LPCTSTR pszModuleDll, LPCSTR pszCreateProc);
//析构函数
virtual ~CTempldateHelper();
//管理函数
public:
//释放组件
bool CloseInstance();
//创建函数
bool CreateInstance();
//配置函数
public:
//创建信息
VOID SetModuleCreateInfo(LPCTSTR pszModuleDllName, LPCSTR pszCreateProc);
//辅助函数
public:
//获取错误
inline LPCTSTR GetErrorDescribe() const;
//指针重载
inline IModeluInterface * operator->() const;
//获取接口
inline IModeluInterface * GetInterface() const;
};
//////////////////////////////////////////////////////////////////////////////////
// CTempldateHelper<IModeluInterface> 外联函数
//构造函数
template <typename IModeluInterface>
CTempldateHelper<IModeluInterface>::CTempldateHelper(REFGUID Guid, DWORD dwVersion) : m_dwVersion(dwVersion), m_Guid(Guid)
{
//辅助变量
m_szDescribe[0]=0;
//内核信息
m_hDllInstance=NULL;
m_pIModeluInterface=NULL;
//组件属性
ZeroMemory(m_szCreateProc,sizeof(m_szCreateProc));
ZeroMemory(m_szModuleDllName,sizeof(m_szModuleDllName));
return;
}
//构造函数
template <typename IModeluInterface>
CTempldateHelper<IModeluInterface>::CTempldateHelper(REFGUID Guid, DWORD dwVersion, LPCTSTR pszModuleDll, LPCSTR pszCreateProc) : m_dwVersion(dwVersion), m_Guid(Guid)
{
//辅助变量
m_szDescribe[0]=0;
//内核信息
m_hDllInstance=NULL;
m_pIModeluInterface=NULL;
//组件属性
lstrcpynA(m_szCreateProc,pszCreateProc,CountArray(m_szCreateProc));
lstrcpyn(m_szModuleDllName,pszModuleDll,CountArray(m_szModuleDllName));
return;
}
//析构函数
template <typename IModeluInterface>
CTempldateHelper<IModeluInterface>::~CTempldateHelper()
{
CloseInstance();
}
//创建组件
template <typename IModeluInterface>
bool CTempldateHelper<IModeluInterface>::CreateInstance()
{
//释放组件
CloseInstance();
//创建组件
try
{
//效验参数
ASSERT(m_szCreateProc[0]!=0);
ASSERT(m_szModuleDllName[0]!=0);
//加载模块
m_hDllInstance=AfxLoadLibrary(m_szModuleDllName);
if (m_hDllInstance==NULL)
{
DWORD dwError = GetLastError();
_sntprintf_s(m_szDescribe,CountArray(m_szDescribe),TEXT("“%s”模块加载失败"),m_szModuleDllName);
return false;
}
//寻找函数
ModuleCreateProc * CreateProc=(ModuleCreateProc *)GetProcAddress(m_hDllInstance,m_szCreateProc);
if (CreateProc==NULL)
{
_sntprintf_s(m_szDescribe, CountArray(m_szDescribe), TEXT("找不到组件创建函数“%s”"), m_szCreateProc);
return false;
}
//创建组件
m_pIModeluInterface=(IModeluInterface *)CreateProc(m_Guid,m_dwVersion);
if (m_pIModeluInterface==NULL)
{
_sntprintf_s(m_szDescribe, CountArray(m_szDescribe), TEXT("调用函数“%s”生成对象失败"), m_szCreateProc);
return false;
}
}
catch (LPCTSTR pszError)
{
_sntprintf_s(m_szDescribe, CountArray(m_szDescribe), TEXT("由于“%s”组件创建失败"), pszError);
return false;
}
catch (...)
{
_sntprintf_s(m_szDescribe, CountArray(m_szDescribe), TEXT("组件创建函数“%s”产生未知异常错误组件创建失败"), m_szCreateProc);
return false;
}
return true;
}
//释放组件
template <typename IModeluInterface>
bool CTempldateHelper<IModeluInterface>::CloseInstance()
{
//设置变量
m_szDescribe[0]=0;
//销毁对象
if (m_pIModeluInterface!=NULL)
{
m_pIModeluInterface->Release();
m_pIModeluInterface=NULL;
}
//释放 DLL
if (m_hDllInstance!=NULL)
{
AfxFreeLibrary(m_hDllInstance);
m_hDllInstance=NULL;
}
return true;
}
//创建信息
template <typename IModeluInterface>
VOID CTempldateHelper<IModeluInterface>::SetModuleCreateInfo(LPCTSTR pszModuleDllName, LPCSTR pszCreateProc)
{
//设置信息
lstrcpynA(m_szCreateProc,pszCreateProc,CountArray(m_szCreateProc));
lstrcpyn(m_szModuleDllName,pszModuleDllName,CountArray(m_szModuleDllName));
return;
}
//////////////////////////////////////////////////////////////////////////////////
// CTempldateHelper<IModeluInterface> 内联函数
//获取描述
template <typename IModeluInterface>
inline LPCTSTR CTempldateHelper<IModeluInterface>::GetErrorDescribe() const
{
return m_szDescribe;
}
//指针重载
template <typename IModeluInterface>
inline IModeluInterface * CTempldateHelper<IModeluInterface>::operator->() const
{
return GetInterface();
}
//获取接口
template <typename IModeluInterface>
inline IModeluInterface * CTempldateHelper<IModeluInterface>::GetInterface() const
{
return m_pIModeluInterface;
}
//////////////////////////////////////////////////////////////////////////////////
//组件辅助宏
//组件创建函数
#define DECLARE_CREATE_MODULE(OBJECT_NAME) \
extern "C" __declspec(dllexport) VOID * Create##OBJECT_NAME(REFGUID Guid, DWORD dwInterfaceVer) \
{ \
C##OBJECT_NAME * p##OBJECT_NAME=NULL; \
try \
{ \
p##OBJECT_NAME=new C##OBJECT_NAME(); \
if (p##OBJECT_NAME==NULL) throw TEXT("创建失败"); \
VOID * pObject=p##OBJECT_NAME->QueryInterface(Guid,dwInterfaceVer); \
if (pObject==NULL) throw TEXT("接口查询失败"); \
return pObject; \
} \
catch (...) {} \
SafeDelete(p##OBJECT_NAME); \
return NULL; \
}
//组件辅助类宏
#define DECLARE_MODULE_DYNAMIC(OBJECT_NAME) \
class C##OBJECT_NAME##Helper : public CTempldateHelper<I##OBJECT_NAME> \
{ \
public: \
C##OBJECT_NAME##Helper() : CTempldateHelper<I##OBJECT_NAME>(IID_I##OBJECT_NAME,VER_I##OBJECT_NAME) { } \
};
//组件辅助类宏
#define DECLARE_MODULE_HELPER(OBJECT_NAME,MODULE_DLL_NAME,CREATE_FUNCTION_NAME) \
class C##OBJECT_NAME##Helper : public CTempldateHelper<I##OBJECT_NAME> \
{ \
public: \
C##OBJECT_NAME##Helper() : CTempldateHelper<I##OBJECT_NAME>(IID_I##OBJECT_NAME, \
VER_I##OBJECT_NAME,MODULE_DLL_NAME,CREATE_FUNCTION_NAME) { } \
};
//////////////////////////////////////////////////////////////////////////////////
#endif