361 lines
9.6 KiB
C++
361 lines
9.6 KiB
C++
#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 |