`
fdyang
  • 浏览: 79682 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

(VC)COM 编程

 
阅读更多

(VC)COM 编程


为什么要用COM?
- 其基本思想就是试图像搭建计算机硬件设备那样的搭建软件模块。
在面向对象编程中,使用可重用的部件,模块。


COM基础理论

COM组件
- COM组件实际上是一个C++类,接口是抽象类(里面都是纯虚函数).
- 组件是从接口派生而来.即组件是从抽象类继承下来的派生类。
- COM中所有的函数都是虚函数,通过虚函数表VTable来调用.


COM组件的三个基本接口类.

1.IUnknown
- 任何接口必须从IUnknown继承.
- IUnknown 包含三个函数. QueryInterface, AddRef, Release. 顺序不可改变.
(1). QueryInterface
- 查询组件实现的其他接口. (查看这个组件的父类有哪些接口类).
(2). AddRef
- 增加引用计数。
(3). Release
- 减少引用计数。
(引用计数: COM组件装到内存后,可以被多个程序调用,每调用(释放)一次,引用计数加一(减一))

2.IClassFactory (类厂)
- 其作用是创建COM组件. (实例化)
- 当客户请求一个组件对象的实例时,类厂收到请求后,创建组件实例,然后把实例指针交给客户程序。
- IClassFactory 的最重要的函数就是: CreateInstance.

3. IDispatch (调度接口)
- 调度接口把每个函数的每个属性都编上号,客户程序要调用函数属性的时候,就把这些编号传个IDispatch接口。


COM组件的核心是IDL

COM组件的工作机制

1. 客户端调用COM API 接口::CoCreateInstance()
- 需要指定两个ID: (1)要实例化类的ID. (2)对象所在的DLL或EXE文件的ID.

2. COM将类ID映射到DLL或EXE文件名.
- 系统通过检查系统注册表,将ID号转化为真实的文件名.

3. COM调用LoadLibrary()装载DLL,或通过RPC启动EXE
- 获得真实文件名后,COM调用API接口LoadLibrary()装载需要的DLL,或者通过远程过程调用API启动相应的EXE文件.

4. COM根据接口的类ID参数通知DLL或EXE创建相应的类的实例.
- 在DLL或EXE创建对象之后,::CoCreateInstance()返回该对象的指针.

5. 调用函数处理,本地DLL调用不需要COM介入,EXE方法的调用需要有COM进行序列化,并使用RPC.
- 本地DLL ,例如: p->Func(a,b);
- 远程,COM自动完成.

6. 客户端释放对象的指针,COM通过卸载DLL或停止EXE真正消灭对象.
- 消灭一个COM对象只需要将该对象的引用计数减一。
- 如果DLL为你的应用程序提供的对象都被释放了,COM就会卸载这个DLL
- 如果EXE为本地或网络上的任何应用程序提供的所有对象都被释放了,COM就会停止这个EXE


使用COM时其实只需要做三件事:

1.创建一个COM对象.
2.与COM对象通行
3.处理上述两件事时遇到的各种问题.


COM编程实例: 1. 在程序中调用"打开文件对话框".(Open Dialog Box)
使用Common Item Dialog object.(COM object)的接口方法:IFileOpenDialog. (头文件:<shobjidl.h> )


COM编程实例: 2. VC++创建COM组件,并通过C# 进行调用.


COM编程实例: 3. 编写Audio测试程序.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics