zoukankan      html  css  js  c++  java
  • COM宏小结

    comments:fetched from 网络
    2008-06-19 18:22

    //========================================================================
    //TITLE:
    //    COM宏小结
    //AUTHOR:
    //    norains
    //DATE:
    //    Wednesday 24-October-2007
    //Environment:
    //        EVC4.0 + Windows CE 5.0 Standard SDK
    //========================================================================
        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_.

  • 相关阅读:
    vmware centos .net core sdk开发测试
    Unable to bind to http://localhost:8080 on the IPv6 loopback interface: 'Cannot assign requested address'.
    把bootstrap4 dropdown 的导航下拉菜单触发方式改为鼠标浮动触发
    vs项目同步到gitee方法
    PetaPoco轻量级ORM框架
    本田汽车车机大屏破解教程
    SqlServer 游标逐行更新数据,根据上一行的数据来更新当前行
    Angular 2/4/5+ 重复点击菜单刷新界面
    Ionic 2 + 手动搭建开发环境教程 【转】
    在过去五分钟内,TypeScript语言服务以外终止了5次
  • 原文地址:https://www.cnblogs.com/Winston/p/1233853.html
Copyright © 2011-2022 走看看