
//QueryInterface的实现

#include <objbase.h>
#include <unknwn.h>
#include <iostream>
using namespace std;

interface IX:IUnknown


{
virtual void __stdcall FX() = 0;
};

interface IY:IUnknown


{
virtual void __stdcall FY() = 0;
};

interface IZ:IUnknown


{
virtual void __stdcall FZ() = 0;
};

extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;

class CA:public IX,public IY


{

virtual void __stdcall FY()
{cout <<"CA::FY"<<endl; }

virtual void __stdcall FX()
{cout <<"CA::FX"<<endl; }
virtual HRESULT STDMETHODCALLTYPE QueryInterface(

/**//* [in] */ REFIID riid,

/**//* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)

{
if(riid == IID_IX)

{
*ppvObject = static_cast<IX*>(this);
}
else if(riid == IID_IY)

{
*ppvObject = static_cast<IY*>(this);
}
else if(riid == IID_IUnknown)

{
*ppvObject = static_cast<IX*>(this);
}
else

{
*ppvObject = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown *>(*ppvObject)->AddRef();//引用计数加
return S_OK;

}

virtual ULONG STDMETHODCALLTYPE AddRef( void)
{ return 0; }

virtual ULONG STDMETHODCALLTYPE Release( void)
{return 0; }

};

IUnknown * CreateInstance()


{
IUnknown * pI = static_cast <IX*>(new CA);
pI->AddRef();
return pI;
}

// {1A5EE493-AD77-4224-9A78-5F2DD3874714}
static const IID IID_IX =


{ 0x1a5ee493, 0xad77, 0x4224,
{ 0x9a, 0x78, 0x5f, 0x2d, 0xd3, 0x87, 0x47, 0x14 } };

// {AB55D03D-2160-4197-8AD2-36A36E33F69B}
static const IID IID_IY =


{ 0xab55d03d, 0x2160, 0x4197,
{ 0x8a, 0xd2, 0x36, 0xa3, 0x6e, 0x33, 0xf6, 0x9b } };

// {5443E124-25A6-451e-A634-2BA392788C38}
static const IID IID_IZ =


{ 0x5443e124, 0x25a6, 0x451e,
{ 0xa6, 0x34, 0x2b, 0xa3, 0x92, 0x78, 0x8c, 0x38 } };

int main(int argc, char* argv[])


{
HRESULT hr;
IUnknown *pUnknown = CreateInstance();
IX *pIX = NULL;
hr = pUnknown->QueryInterface(IID_IX,(void **)(&pIX));
if(SUCCEEDED(hr))

{
pIX->FX();
}

IY *pIY = NULL;
hr = pUnknown->QueryInterface(IID_IY,(void **)(&pIY));
if(SUCCEEDED(hr))

{
pIY->FY();
}
delete pUnknown;
system("pause");
return 0;
}



【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2007-04-17 OpenGL入门笔记(四)
2007-04-17 OpenGL入门笔记(三)