COM宏小结

 转自:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2007112/82245.html

 

COM接口用到的宏主要有六个:

STDMETHOD,STDMETHODIMP,STDMETHOD_,STDMETHODIMP_,SUCCEEDED,FAILED.
   
    我们首先来看看这六个宏的定义:
   
    STDMETHOD
  #define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method
  #ifdef _WIN32 // Win32 doesn't support __export
  #define STDMETHODCALLTYPE __stdcall
  #else
  #define STDMETHODCALLTYPE __export __stdcall
  #endif

 

  STDMETHODIMP
  #define STDMETHODIMP HRESULT STDMETHODCALLTYPE
  #ifdef _WIN32 // Win32 doesn't support __export
  #define STDMETHODCALLTYPE __stdcall
  #else
  #define STDMETHODCALLTYPE __export __stdcall
  #endif

  STDMETHOD_:
  #define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
  #ifdef _WIN32 // Win32 doesn't support __export
  #define STDMETHODCALLTYPE __stdcall
  #else
  #define STDMETHODCALLTYPE __export __stdcall
  #endif

  STDMETHODIMP_:
  #define STDMETHODIMP_(type) type STDMETHODCALLTYPE
  #ifdef _WIN32 // Win32 doesn't support __export
  #define STDMETHODCALLTYPE __stdcall
  #else
  #define STDMETHODCALLTYPE __export __stdcall
  #endif

  SUCCEEDED
  #define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)

  FAILED:
  #define FAILED(Status) ((HRESULT)(Status)<0)


    由定义我们可以看出两点:
   
    1)STDMETHOD和STDMETHODIMP,STDMETHOD_和STDMETHODIMP_分别为一对,SUCCEEDED和FAILED为相反.
   
    2)STDMETHOD只是STDMETHOD_的简化版.
      比如这两个语句互为等价关系:
      STDMETHOD (QueryInterface) (REFIID riid, LPVOID * ppv);
      STDMETHOD_ (HRESULT,QueryInterface) (REFIID riid, LPVOID * ppv);
     
   
    既然有STDMETHOD,也有STDMETHODIMP,那么应该在什么情况下使用其中一个呢?
   
    如果继承的函数的声明和定义都在类内定义,则只需使用STDMETHOD即可,如:
    //
    //Browser.h
    //
    class CBrowser:public IOleContainer
    {
      ...
      STDMETHOD(LockContainer)(BOOL){return OK;}    
    }
   
    如果函数的定义在外部,那么声明采用STDMETHOD,定义时使用STDMETHODIMP
    //
    //Browser.h
    //
    class CBrowser:public IOleContainer
    {
      ...
      STDMETHOD(LockContainer)(BOOL);    
    }
   
    //
    //Browser.cpp
    //
    STDMETHODIMP CBrowser::LockContainer(BOOL)
    {
     return S_OK;
    }
   
    如果将定义的STDMETHODIMP改为声明的STDMETHOD,则编译出错.同样的情况也出现于STDMETHOD_和STDMETHODIMP_.


文章出处:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2007112/82245.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值