《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 = 
{ 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;
}



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/04/17/1158971.html,如需转载请自行联系原作者
目录
相关文章
|
存储 分布式计算 监控
深入浅出 HBase 实战 | 青训营笔记
Hbase是一种NoSQL数据库,这意味着它不像传统的RDBMS数据库那样支持SQL作为查询语言。Hbase是一种分布式存储的数据库,技术上来讲,它更像是分布式存储而不是分布式数据库,它缺少很多RDBMS系统的特性,比如列类型,辅助索引,触发器,和高级查询语言等待。
828 0
深入浅出 HBase 实战 | 青训营笔记
|
5月前
|
算法 机器人 C++
C++零基础全面教程(开篇介绍)
C++零基础全面教程(开篇介绍)
35 0
|
9月前
|
缓存 JavaScript 前端开发
面试题练习第三篇
面试题练习第三篇
131 0
|
10月前
|
前端开发 C# 数据库管理
(3) MasaFramework 入门第三篇,使用MasaFramework
(3) MasaFramework 入门第三篇,使用MasaFramework
66 0
(3) MasaFramework 入门第三篇,使用MasaFramework
|
12月前
|
C++
c++第一篇
c++第一篇
|
12月前
|
算法 JavaScript Devops
2022年的第一篇总结
今年有个新的计划,就是每过一段时间,比如说两个月,对自己的工作和生活进行总结和反思。
|
存储 分布式计算 负载均衡
深入浅出 HBase 实战|青训营笔记
1.介绍 HBase 的适用场景和数据模型;2.分析 HBase 的整体架构和模块设计;3.针对大数据场景 HBase 的解决方案
183 0
深入浅出 HBase 实战|青训营笔记
|
Java Linux
终于可以写第一篇文章了
在写文章之前,需要先获得开发者认证。本文主要介绍获得开发者认证之前的做题感受。
586 0
第一篇文章
FIRST ARTICLE.
1342 0

相关实验场景

更多