A simple Demo
#include <ObjBase.h>
#include <iostream>
using namespace std;
void trace(const char * msg)
{
cout<<msg<<endl;
}
//Forward references for GUIDs
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
//Interfaces
interface IX :IUnknown
{
virtual void _stdcall Fx() = 0;
};
interface IY :IUnknown
{
virtual void _stdcall Fy() = 0;
};
interface IZ :IUnknown
{
virtual void _stdcall Fz() = 0;
};
//
//Component
//
class CA : public IX,
public IY
{
public:
//IUnknown implementation
virtual HRESULT _stdcall QueryInterface(const IID& iid, void** ppv);
virtual ULONG _stdcall AddRef();
virtual ULONG _stdcall Release();
//Interface IX implementation
virtual void _stdcall Fx()
{
cout<<"Fx"<<endl;
}
//Interface IX implementation
virtual void _stdcall Fy()
{
cout<<"Fy"<<endl;
}
//Constructor
CA():m_cRef(0){}
//Destructor
~CA()
{
trace("CA: Destory self.");
}
private:
long m_cRef;
};
HRESULT _stdcall CA::QueryInterface(const IID& iid, void** ppv)
{
if (IID_IUnknown == iid)
{
trace("CA QI: Return pointer to IUnknown.");
*ppv = static_cast<IX*>(this);
}
else if(IID_IX == iid)
{
trace("CA QI: Return pointer to IX.");
*ppv = static_cast<IX*>(this);
}
else if(IID_IY == iid)
{
trace("CA QI: Return pointer to IY.");
*ppv = static_cast<IY*>(this);
}
else
{
trace("CA QI: Interface note supported.");
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
ULONG _stdcall CA::AddRef()
{
cout<<"CA: AddRef = "<<m_cRef + 1<<'.'<<endl;
return InterlockedIncrement(&m_cRef);
}
ULONG _stdcall CA::Release()
{
cout<<"CA: Release = "<<m_cRef - 1<<'.'<<endl;
if (0 == InterlockedDecrement(&m_cRef))
{
delete this;
return 0;
}
return m_cRef;
}
//
//Creation function
//
IUnknown* CreateInstance()
{
IUnknown* pI = static_cast<IX*>(new CA);
pI->AddRef();
return pI;
}
//
//IIDS
//
//{32bb8320-b41b-11cf-a6bb-0080c7b2d682}
const IID IID_IX =
{
0x32bb8320,0xb41b,0x11cf,
{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};
//{32bb8321-b41b-11cf-a6bb-0080c7b2d682}
const IID IID_IY =
{
0x32bb8321,0xb41b,0x11cf,
{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};
//{32bb8322-b41b-11cf-a6bb-0080c7b2d682}
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.
pIX->Release();
}
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.
pIY->Release();
}
trace("Client:Ask for an unsupported interface.");
IZ* pIZ = NULL;
hr = pIUnknown->QueryInterface(IID_IZ,(void**)&pIZ);
if (SUCCEEDED(hr))
{
trace("Client:Succeeded getting IZ.");
pIZ->Fz();
pIZ->Release();
}
else
{
trace("Client:Could not get interface IZ.");
}
trace("Client:Release IUnknown interface.");
pIUnknown->Release();
return 0;
}
#include <iostream>
using namespace std;
void trace(const char * msg)
{
cout<<msg<<endl;
}
//Forward references for GUIDs
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
//Interfaces
interface IX :IUnknown
{
virtual void _stdcall Fx() = 0;
};
interface IY :IUnknown
{
virtual void _stdcall Fy() = 0;
};
interface IZ :IUnknown
{
virtual void _stdcall Fz() = 0;
};
//
//Component
//
class CA : public IX,
public IY
{
public:
//IUnknown implementation
virtual HRESULT _stdcall QueryInterface(const IID& iid, void** ppv);
virtual ULONG _stdcall AddRef();
virtual ULONG _stdcall Release();
//Interface IX implementation
virtual void _stdcall Fx()
{
cout<<"Fx"<<endl;
}
//Interface IX implementation
virtual void _stdcall Fy()
{
cout<<"Fy"<<endl;
}
//Constructor
CA():m_cRef(0){}
//Destructor
~CA()
{
trace("CA: Destory self.");
}
private:
long m_cRef;
};
HRESULT _stdcall CA::QueryInterface(const IID& iid, void** ppv)
{
if (IID_IUnknown == iid)
{
trace("CA QI: Return pointer to IUnknown.");
*ppv = static_cast<IX*>(this);
}
else if(IID_IX == iid)
{
trace("CA QI: Return pointer to IX.");
*ppv = static_cast<IX*>(this);
}
else if(IID_IY == iid)
{
trace("CA QI: Return pointer to IY.");
*ppv = static_cast<IY*>(this);
}
else
{
trace("CA QI: Interface note supported.");
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
ULONG _stdcall CA::AddRef()
{
cout<<"CA: AddRef = "<<m_cRef + 1<<'.'<<endl;
return InterlockedIncrement(&m_cRef);
}
ULONG _stdcall CA::Release()
{
cout<<"CA: Release = "<<m_cRef - 1<<'.'<<endl;
if (0 == InterlockedDecrement(&m_cRef))
{
delete this;
return 0;
}
return m_cRef;
}
//
//Creation function
//
IUnknown* CreateInstance()
{
IUnknown* pI = static_cast<IX*>(new CA);
pI->AddRef();
return pI;
}
//
//IIDS
//
//{32bb8320-b41b-11cf-a6bb-0080c7b2d682}
const IID IID_IX =
{
0x32bb8320,0xb41b,0x11cf,
{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};
//{32bb8321-b41b-11cf-a6bb-0080c7b2d682}
const IID IID_IY =
{
0x32bb8321,0xb41b,0x11cf,
{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};
//{32bb8322-b41b-11cf-a6bb-0080c7b2d682}
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.
pIX->Release();
}
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.
pIY->Release();
}
trace("Client:Ask for an unsupported interface.");
IZ* pIZ = NULL;
hr = pIUnknown->QueryInterface(IID_IZ,(void**)&pIZ);
if (SUCCEEDED(hr))
{
trace("Client:Succeeded getting IZ.");
pIZ->Fz();
pIZ->Release();
}
else
{
trace("Client:Could not get interface IZ.");
}
trace("Client:Release IUnknown interface.");
pIUnknown->Release();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现