#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(this); //查询接口 #define QUERYINTERFACE_IUNKNOWNEX(BaseInterface,Guid,dwQueryVer) \ if ((Guid==IID_IUnknownEx)&&(InterfaceVersionCompare(dwQueryVer,VER_IUnknownEx))) \ return static_cast(static_cast(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 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 外联函数 //构造函数 template CTempldateHelper::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 CTempldateHelper::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 CTempldateHelper::~CTempldateHelper() { CloseInstance(); } //创建组件 template bool CTempldateHelper::CreateInstance() { //释放组件 CloseInstance(); //创建组件 try { //效验参数 ASSERT(m_szCreateProc[0]!=0); ASSERT(m_szModuleDllName[0]!=0); //加载模块 m_hDllInstance=AfxLoadLibrary(m_szModuleDllName); if (m_hDllInstance==NULL) { _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 bool CTempldateHelper::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 VOID CTempldateHelper::SetModuleCreateInfo(LPCTSTR pszModuleDllName, LPCSTR pszCreateProc) { //设置信息 lstrcpynA(m_szCreateProc,pszCreateProc,CountArray(m_szCreateProc)); lstrcpyn(m_szModuleDllName,pszModuleDllName,CountArray(m_szModuleDllName)); return; } ////////////////////////////////////////////////////////////////////////////////// // CTempldateHelper 内联函数 //获取描述 template inline LPCTSTR CTempldateHelper::GetErrorDescribe() const { return m_szDescribe; } //指针重载 template inline IModeluInterface * CTempldateHelper::operator->() const { return GetInterface(); } //获取接口 template inline IModeluInterface * CTempldateHelper::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 \ { \ public: \ C##OBJECT_NAME##Helper() : CTempldateHelper(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 \ { \ public: \ C##OBJECT_NAME##Helper() : CTempldateHelper(IID_I##OBJECT_NAME, \ VER_I##OBJECT_NAME,MODULE_DLL_NAME,CREATE_FUNCTION_NAME) { } \ }; ////////////////////////////////////////////////////////////////////////////////// #endif