`
dato0123
  • 浏览: 915079 次
文章分类
社区版块
存档分类
最新评论

COM宏小结

 
阅读更多

//========================================================================
//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_.

分享到:
评论

相关推荐

    精通DirectX.3D图形与动画程序设计.pdf

    1.6 小结 第2章 direct3d程序设计基础 2.1 相关基础知识 2.2 direct3d体系结构 2.3 direct3d对象 2.4 direct3d设备对象 2.4.1 direct3d设备类型 2.4.2 创建direct3d设备对象 2.5 direct3d程序基本结构 . 2.6 最简单...

    精通MFC (光盘) 源代码

    目录 第1章 面向对象编程 1.1 面向对象的基本概念 1.1.1 类和对象 1.1.2 封装、多态和继承 1.1.3 消息 1.2 面向对象的建模技术UML 1.2.1 类图 1.2.2 交互图 1.2.3 用例图 1.3 面向对象的C++语言... 16.5 小结

    McGraw C++程序调试实用手册

    内容简介 · · · · · ·  本书作为有关 Visual C++ Debugger的专著,是一本非常难得的好书。书中深入地分析了开发不包含逻辑和语法错误的代码技巧以及调试程序的基本原理,介绍了开发和调试命令行...17.3 小结

    Visual.C#2010从入门到精通

    1.5 小结 16 第2章 使用Visual C++创建基本应用程序 17 2.1 理解Visual C++工程 17 2.2 Visual C++中应用程序的类型 18 2.2.1 控制台应用程序 18 2.2.2 基于对话框的应用程序 19 2.2.3 单文档应用程序 19 2.2.4 多...

    PHPWeb开发技术指南——pdf格式

    1.7 小结 22 第2章 高级语法 23 2.1 PHP语法 23 2.2 定义常量 24 2.3 数组函数 25 2.4 PHP和OOP 31 2.4.1 类:PHP 3.0和PHP 4.0的对比 35 2.4.2 执行类 36 2.4.3 读取对象 37 2.4.4 构造函数 38 2.4.5 继承 38 2.4.6...

    PHP4.0 高级篇

    1.7 小结 22 第2章 高级语法 23 2.1 PHP语法 23 2.2 定义常量 24 2.3 数组函数 25 2.4 PHP和OOP 31 2.4.1 类:PHP 3.0和PHP 4.0的对比 35 2.4.2 执行类 36 2.4.3 读取对象 37 2.4.4 构造函数 38 2.4.5 继承 38 2.4.6...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    1.6 小结 62 第2章 对象和visual basic 63 2.1 面向对象的术语 64 2.1.1 对象、类和实例 64 2.1.2 对象的组成 65 2.1.3 system.object 68 2.2 使用visual basic类型 68 2.2.1 值类型和引用类型 69 ...

    ExcelVBA程序设计.doc

    1.8 小结 4 第二课 处理录制的宏 4 2.1 为宏指定快捷键 4 2.2 决定宏保存的位置 5 2.3 个人宏工作簿 5 2.3.1 保存宏到个人宏工作簿 5 2.3.2 使用并编辑个人宏工作簿中的宏 5 2.4 将宏指定给按钮 6 2.5 将宏指定给...

    Excel_VBA教程

    1.8 小结 4 第二课 处理录制的宏 4 2.1 为宏指定快捷键 4 2.2 决定宏保存的位置 5 2.3 个人宏工作簿 5 2.3.1 保存宏到个人宏工作簿 5 2.3.2 使用并编辑个人宏工作簿中的宏 5 2.4 将宏指定给按钮 6 2.5 将宏指定给...

    WINDOWS系统开发汇编语言教程

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 ...

    汇编语言教程(AoGo汇编网站)

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 ...

    汇编语言教程Assembly Language

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 ...

    汇编语言.chm 学习汇编语言入门

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 ...

    汇编语言基础教程(8086).rar

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 十字...

    汇编语言基础教程 汇编语言基础教程

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 ...

    汇编语言教程-学习的极佳资料

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 ...

    汇编语言教程.chm

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 ...

    汇编语言入门到精通文档

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 ...

    汇编语言基础学习资料

     3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义  1 内存变量定义的一般形式  2 字节变量  3 字变量  4 双字变量  5 六字节变量  6 八字节变量  7 ...

Global site tag (gtag.js) - Google Analytics