接口的实现以及QueryInterface的实现和使用方法

这篇文章给大家介绍接口的实现以及QueryInterface的实现和使用方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于成都网站建设、网站设计、集宁网络推广、小程序开发、集宁网络营销、集宁企业策划、集宁品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供集宁建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

interface IX : public IUnknown
{
virtual void _stdcall Fx() = 0;
};

interface IY : public IUnknown
{
virtual void _stdcall Fy() = 0;
};

interface IZ : public IUnknown
{
virtual void _stdcall Fz() = 0;
};

static const IID IID_IX = {0xff5ba880, 0xa371, 0x4a42, {0x87, 0x20, 0x96, 0xe0, 0x4d, 0x68, 0xd, 0x76}}; // {FF5BA880-A371-4a42-8720-96E04D680D76}
static const IID IID_IY = {0xde44d538, 0xe926, 0x4d5f, {0x94, 0x5d, 0x61, 0x83, 0x86, 0x7c, 0x63, 0x41}}; // {DE44D538-E926-4d5f-945D-6183867C6341}
static const IID IID_IZ = {0x91157d15, 0x22b1, 0x45d9, {0xb4, 0xc9, 0x81, 0x3, 0x8d, 0xec, 0xef, 0xad}};   // {91157D15-22B1-45d9-B4C9-81038DECEFAD}

class CA : public IX,
public IY
{
public:
virtual HRESULT _stdcall QueryInterface(REFIID riid, __RPC__deref_out void **ppvObject);
virtual ULONG _stdcall AddRef() { return 0; }
virtual ULONG _stdcall Release() { return 0; }

virtual void _stdcall Fx() { cout<<"IX::Fx"<

virtual void _stdcall Fy() { cout<<"IY::Fy"<};

HRESULT _stdcall CA::QueryInterface(REFIID riid, __RPC__deref_out void **ppvObject)
{
if(IID_IX == riid)
{
*ppvObject = static_cast(this);
}
else if(IID_IY == riid)
{
*ppvObject = static_cast(this);
}
else if(IID_IUnknown == riid)
{
//*ppvObject = static_cast(this); //这样为什么不行
*ppvObject = static_cast(this);
}
else
{
*ppvObject = NULL;
return E_NOINTERFACE;
}

reinterpret_cast(*ppvObject)->AddRef();
return S_OK;
}

IUnknown* CreateInstance()
{
IUnknown *pIUnk = static_cast(new CA);
pIUnk->AddRef();
return pIUnk;
}

void _tmain(int argc,_TCHAR*argv[])
{
IUnknown *pIUnk = CreateInstance();

IX *pIX = NULL;
HRESULT hr = pIUnk->QueryInterface(IID_IX,(void**)&pIX);
if(SUCCEEDED(hr))
{
pIX->Fx();
}

IY *pIY = NULL;
hr = pIUnk->QueryInterface(IID_IY,(void**)&pIY);
if(SUCCEEDED(hr))
{
pIY->Fy();
}

IZ *pIZ = NULL;
hr = pIUnk->QueryInterface(IID_IZ,(void**)&pIZ);
if(SUCCEEDED(hr))
{
cout<<"Succeed to find pIZ"< pIZ->Fz();
}

IY *pIYFromIX = NULL;
hr = pIX->QueryInterface(IID_IY,(void**)&pIYFromIX);
if(SUCCEEDED(hr))
{
pIYFromIX->Fy();
}

IUnknown *pIUnkFromIY = NULL;
hr = pIY->QueryInterface(IID_IUnknown,(void**)&pIUnkFromIY);
if(SUCCEEDED(hr))
{
if(pIUnkFromIY == pIUnk)
cout<<"pIUnkFromIY == pIUnk"< else
  cout<<"pIUnkFromIY != pIUnk"< }

if(pIUnk) delete pIUnk;
}

关于接口的实现以及QueryInterface的实现和使用方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


当前标题:接口的实现以及QueryInterface的实现和使用方法
网站链接:http://bzwzjz.com/article/igsood.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 自适应网站设计 成都网站制作 网站建设 重庆网站建设 成都商城网站制作 响应式网站设计方案 成都网站建设 成都网站建设 定制网站建设多少钱 网站设计制作报价 营销网站建设 成都网站设计 企业网站建设 重庆企业网站建设 重庆网站建设 网站建设推广 专业网站建设 手机网站建设 重庆网站制作 成都网站建设 成都网站设计 成都企业网站设计