Windows编程之COM组件
2016-02-02 14:25
288 查看
什么是COM接口?
COM即Component Object Model,到底是用来干啥的呢?如果你了解Java或者C#,你应该会很了解interface。在C++中,最接近接口概念的应该是虚类了,所谓虚类,就是只包含虚函数的类。下面是接口的例子
// The following is not actual COM. // Pseudo-C++: interface IDrawable { void Draw(); };
IDrawable这个接口定义了任何可绘制的对象必须支持的方法,(顺便说一句,接口的名字必须以I开头)。在这个接口中,IDrawable接口定义了一个最简单的操作:Draw。所有的接口都是抽象的,故而下面的代码是不能够编译的。
IDrawable draw; draw.Draw();
在C++中,虚类的实现主要依靠多态:
class Shape : public IDrawable { public: virtual void Draw(); // Override Draw and provide implementation. }; class Bitmap : public IDrawable { public: virtual void Draw(); // Override Draw and provide implementation. };
Shape Bitmap类定义了两个完全不同的可绘制对象。每一个类继承IDrawable类并且重写了类里面的虚函数。任何使用IDrawable的程序必须通过IDrawable指针来处理Shape和Bitmap,而不是直接定义Shape 或Bitmap的指针。
IDrawable *pDrawable = CreateTriangleShape(); if (pDrawable) { pDrawable->Draw(); }
下面是一个IDrawablez指针数组的循环。数组可能没有明确的分类(shapes,bitmaps或者其它),但他们都继承IDrawable类。
void DrawSomeShapes(IDrawable **drawableArray, size_t count) { for (size_t i = 0; i < count; i++) { drawableArray[i]->Draw(); } }
COM最重要的一点就是调用代码从来看不到派生类。换句话说,你不能够在你的code中声明Shape或者Bitmap类型。所有关于Shape or Bitmap 的操作都是通过使用IDrawable指针实现的。通过这种方式,COM能够保持接口和实现的分隔,从而实现多态。需要注意的是,上面的代码并不是真正的COM代码,它们只是为了解释说明COM。 当你使用COM的时候,你要记住接口不是对象!不同的对象能够实现同一个接口,同一个对象也能够实现不同的接口。
// An interface for serialization. class ISerializable { public: virtual void Load(PCWSTR filename) = 0; // Load from file. virtual void Save(PCWSTR filename) = 0; // Save to file. }; // Declarations of drawable object types. class Shape : public IDrawable { ... }; class Bitmap : public IDrawable, public ISerializable { ... };
Ok,就介绍到这里,下一篇文章将介绍COM的初始化。
相关文章推荐
- windows下用Eclipse编译运行android原生浏览器
- 谈谈visual studio QTCreator eclipse的远程调试
- Qt(12):画笔,画刷,反走样以及渐变
- eclipse中maven插件安装及常用命令
- Github上的andoird开源组件整理
- 简单Spring中的Quartz配置(收集)
- Mac OS下安装MyEclipse报错:Your system does not have sufficient memory to support MyEclipse
- Python 第十一章 常用第三方模块
- c++ imooc自学计划
- R.java was modified manually! Reverting to generated version!(R文件丢失异常原因汇总)
- Python docs
- SpringMVC入门了解
- Python docs
- delphi不同版本字符串类型的演化
- python3 黑板客爬虫闯关游戏(四)
- Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.transaction.spi.TransactionContext
- java Remote Debug(远程调试)
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Python Scrapy抓取数据
- Spring通过构造方法注入的四种方式