前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >QueryInterface函数

QueryInterface函数

作者头像
全栈程序员站长
发布2022-09-07 10:27:27
3990
发布2022-09-07 10:27:27
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

《COM技术内幕》 §3 —— QueryInterface函数

§3 —— IUnknown.CPP代码清单:

// //IUnkown.cpp // // #include <iostream.h> #include <objbase.h> void trace(const char * msg) {cout << msg << endl ;} //Interface interface IX : IUnknown { virtual void __stdcall Fx() = 0; }; interface IY : IUnknown { virtual void __stdcall Fy() = 0; }; interface IZ : IUnknown { virtual void __stdcall Fz() = 0; }; //Forward references for GUIDs extern const IID IID_IX; extern const IID IID_IY; extern const IID IID_IZ; // //Component // class CA : public IX, public IY { //IUnknown implementation virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv); virtual ULONG __stdcall AddRef() { return 0;} virtual ULONG __stdcall Release() { return 0;} //Interface IX implementation virtual void __stdcall Fx() {cout << “Fx” << endl ;} //Interface IY implementation virtual void __stdcall Fy() {cout << “Fy” << endl ;} }; HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv) { if(iid == IID_IUnknown) { trace(“QueryInterface:Return pointer to IUnknown.”); *ppv = static_cast< IX* >(this); } else if(iid == IID_IX) { trace(“QueryInterface:Return pointer to IX.”); *ppv = static_cast< IX* >(this); } else if(iid == IID_IY) { trace(“QueryInterface:Return pointer to IY.”); *ppv = static_cast< IY* >(this); } else { trace(“QueryInterface:Interface not supported.”); *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast< IUnknown* >(*ppv)->AddRef(); return S_OK; } // //Creation function // IUnknown* CreateInstance() { IUnknown* pI = static_cast< IX* >(new CA); pI->AddRef(); return pI; } // //IIDs // //{32bb8320-b41b-11cf-a6bb-0080c7b2d682} static const IID IID_IX = {0x32bb8320, 0xb41b, 0x11cf, {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}}; //{32bb8321-b41b-11cf-a6bb-0080c7b2d682} static const IID IID_IY = {0x32bb8321, 0xb41b, 0x11cf, {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}}; //{32bb8322-b41b-11cf-a6bb-0080c7b2d682} static const IID IID_IZ = {0x32bb8322, 0xb41b, 0x11cf, {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}}; // //Client // int main() { HRESULT hr; trace(“Client:Get an IUnknown pointer.”); IUnknown* pIUnknown = CreateInstance(); trace(“Client:Get Interface IX.”); IX* pIX = NULL; hr = pIUnknown->QueryInterface(IID_IX,(void**)&pIX); if(SUCCEEDED(hr)) { trace(“Client:Succeeded getting IX.”); pIX->Fx(); //Use interface IX } trace(“Client:Get Interface IY.”); IY* pIY = NULL; hr = pIUnknown->QueryInterface(IID_IY,(void**)&pIY); if(SUCCEEDED(hr)) { trace(“Client:Succeeded getting IY.”); pIY->Fy(); //Use interface IY } trace(“Client:Get Interface IZ.”); IZ* pIZ = NULL; hr = pIUnknown->QueryInterface(IID_IZ,(void**)&pIZ); if(SUCCEEDED(hr)) { trace(“Client:Succeeded getting IZ.”); pIZ->Fz(); } else { trace(“Client:Could not get interface IZ.”); } trace(“Client:Get interface IY from interface IX.”); IY* pIYfromIX = NULL; hr = pIX->QueryInterface(IID_IY, (void**)&pIYfromIX); if(SUCCEEDED(hr)) { trace(“Client:Succeeded getting IY.”); pIYfromIX->Fy(); } trace(“Client:Get interface IUnknown from IY.”); IUnknown* pIUknownFromIY = NULL; hr = pIY->QueryInterface(IID_IUnknown, (void**)&pIUknownFromIY); if(SUCCEEDED(hr)) { cout << “equal?” ; if(pIUknownFromIY == pIUnknown) { cout << “Yes.” << endl; } else { cout << “No.” << endl; } } //Delete the component delete pIUnknown; return 0; }

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147640.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 《COM技术内幕》 §3 —— QueryInterface函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档