Chinaunix首页 | 论坛 | 博客
  • 博客访问: 282006
  • 博文数量: 80
  • 博客积分: 2269
  • 博客等级: 大尉
  • 技术积分: 836
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-09 11:07
文章分类

全部博文(80)

文章存档

2016年(1)

2013年(8)

2012年(23)

2011年(21)

2010年(21)

2009年(6)

我的朋友

分类:

2009-12-18 16:47:10

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;
    }
 
珍惜他人劳动:)
 
阅读(698) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~