《COM技术内幕》笔记(一)


//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 = 
0x1a5ee4930xad770x42240x9a0x780x5f0x2d0xd30x870x470x14 } };

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

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

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;
}



posted on   Phinecos(洞庭散人)  阅读(969)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 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入门笔记(三)

导航

统计

点击右上角即可分享
微信分享提示