网狐棋牌(十) 成也萧何败也肖何? IUnknowEx
生活随笔
收集整理的這篇文章主要介紹了
网狐棋牌(十) 成也萧何败也肖何? IUnknowEx
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
相關UML:
看下某個查詢接口的代碼:
//
//接口查詢宏
#define?QUERYINTERFACE(Interface,Guid,dwQueryVer)????????????????????????????????????????\
????if?((Guid==IID_##Interface)&&(InterfaceVersionCheck(dwQueryVer,VER_##Interface)))????\
????????return?static_cast<Interface?*>(this);????????????????????????????????????????????
#define?QUERYINTERFACE_IUNKNOWNEX(BaseInterface,Guid,dwQueryVer)????????????????????????\
????if?((Guid==IID_IUnknownEx)&&(InterfaceVersionCheck(dwQueryVer,VER_IUnknownEx)))????????\
????????return?static_cast<IUnknownEx?*>(static_cast<BaseInterface?*>(this));????????????
//獲取接口宏
#define?GET_MYSELF_INTERFACE(Interface)????????????????????????????????????????????????????\
????((Interface?*)QueryInterface(IID_##Interface,VER_##Interface))
#define?GET_OBJECT_INTERFACE(Object,Interface)????????????????????????????????????????????\
????((Interface?*)Object.QueryInterface(IID_##Interface,VER_##Interface))
#define?GET_OBJECTPTR_INTERFACE(pObject,Interface)????????????????????????????????????????\
????((pObject==NULL)?NULL:((Interface?*)pObject->QueryInterface(IID_##Interface,VER_##Interface)))
//
//接口查詢
void?*?__cdecl?CEventService::QueryInterface(const?IID?&?Guid,?DWORD?dwQueryVer)
{
????QUERYINTERFACE(IEventService,Guid,dwQueryVer);
????QUERYINTERFACE_IUNKNOWNEX(IEventService,Guid,dwQueryVer);
????return?NULL;
}
由于這個函數的存在,是的接口傳遞的類型檢查由編譯期轉到了運行期。
任意接口的傳遞都只需要傳遞一個IUnknowEx指針,然后接受方使用IUnknowEx去判斷是否是自己需要的接口。
這個機制是好是壞,難說,,,
看下某個查詢接口的代碼:
//
//接口查詢宏
#define?QUERYINTERFACE(Interface,Guid,dwQueryVer)????????????????????????????????????????\
????if?((Guid==IID_##Interface)&&(InterfaceVersionCheck(dwQueryVer,VER_##Interface)))????\
????????return?static_cast<Interface?*>(this);????????????????????????????????????????????
#define?QUERYINTERFACE_IUNKNOWNEX(BaseInterface,Guid,dwQueryVer)????????????????????????\
????if?((Guid==IID_IUnknownEx)&&(InterfaceVersionCheck(dwQueryVer,VER_IUnknownEx)))????????\
????????return?static_cast<IUnknownEx?*>(static_cast<BaseInterface?*>(this));????????????
//獲取接口宏
#define?GET_MYSELF_INTERFACE(Interface)????????????????????????????????????????????????????\
????((Interface?*)QueryInterface(IID_##Interface,VER_##Interface))
#define?GET_OBJECT_INTERFACE(Object,Interface)????????????????????????????????????????????\
????((Interface?*)Object.QueryInterface(IID_##Interface,VER_##Interface))
#define?GET_OBJECTPTR_INTERFACE(pObject,Interface)????????????????????????????????????????\
????((pObject==NULL)?NULL:((Interface?*)pObject->QueryInterface(IID_##Interface,VER_##Interface)))
//
//接口查詢
void?*?__cdecl?CEventService::QueryInterface(const?IID?&?Guid,?DWORD?dwQueryVer)
{
????QUERYINTERFACE(IEventService,Guid,dwQueryVer);
????QUERYINTERFACE_IUNKNOWNEX(IEventService,Guid,dwQueryVer);
????return?NULL;
}
由于這個函數的存在,是的接口傳遞的類型檢查由編譯期轉到了運行期。
任意接口的傳遞都只需要傳遞一個IUnknowEx指針,然后接受方使用IUnknowEx去判斷是否是自己需要的接口。
這個機制是好是壞,難說,,,
總結
以上是生活随笔為你收集整理的网狐棋牌(十) 成也萧何败也肖何? IUnknowEx的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网狐棋牌(八) 异步引擎 和 网狐棋牌(
- 下一篇: 关于网狐棋牌6603源码的整理、编译和搭