1.3 DirectX 构件对象模型

  这部分描述了构件对象模型(COM) (译者按:构件对象模型是从OLE中派生出来的一种结构) 及它是如何实现DirectX目标及接口,分以下几部分:

  1. 构件对象模型(COM)
  2. IUnknown 接口
  3. 构件对象模型接口
  4. C++与构件对象模型接口
  5. 可改动的新接口
  6. 用C访问构件对象模型
  7. 宏的命名及语法

1 构件对象模型(COM)

  大多数的DirectX API的对象及接口都是基于构件对象模型。 构件对象模型是建立在一个使用面向对象的系统之上的, 这就是构件对象模型程序的核心模式。这也是一个可以创建多个接口的接口。 它是一个操作系统级的对象模型。

  许多DirectX API都是以构件对象模型为标准而创建的。你可以这样理解: 一个对象就象一个黑盒子记录了硬件及应用程序通过一个接口所进行的所需的通讯。 命令送到或接收自一个通过构件对象模型接口的对象,这就叫做宏。 例如:IDirectDraw4::GetDisplayMode宏是通过IDirectDraw4接口从 DirectDraw对象来获得当前显示适配器的显示模式。

  在运行时一个对象可以与另一个对象相互捆绑, 也可以使用其他对象所提供的接口。如果你知道对象是构件对象模型对象, 并知道这个对象所支持的接口,你的应用程序(或另一个对象) 便可决定第一对象所能提供的服务。所有的构件对象模型的对象都能继承一个宏, 查询接口宏,能让你决定对象提供的接口并为这些接口创建指针。 要获得关于这个宏更多的信息,详见 IUnknown 接口

2 IUnknown 接口

  所有的构件对象模型(以下简称COM)接口都是从一个叫IUnknown 的接口派生出来的。这个接口使DirectX能一直控制对象并有能力操作更复杂的接口。 IUnknown有以下三个宏:

  1. AddRef,能使一个对象的关联值在当一个接口或另一个应用程序将自己连接到这个对象时加一。

    IUnknown::AddRef
    ULONG AddRef();

    无参数
    返回值:返回一个新的关联值。这个值只在诊断或测试时有使用意义。
    注释:当对象被创建,它的关联值被设置为1。 每次应用程序获得对象的接口或调用AddRef宏时, 这个对象的关联值会增加一。可以使用Release宏来使对象的关联值减一。
    这部分IUnknown 宏接口继承于对象.
    其他:
    Windows NT: 需要3.1或更高版本
    Windows: 需要Windows 95或更高版本
    Windows CE: 不支持
    头文件:Unknwn.h

  2. QueryInterface,获得对象所支持的所需特殊接口指针的特性。 它决定对象是否支持一个特殊的COM接口。 如果是,系统会增加对象的关联值,并且应用程序可立即使用这个接口。

    HRESULT QueryInterface(REFIID riid, LPVOID* obp);

    参数:

    返回值:
    对于Direct3D的保留接口模式及底层接口模式, QueryInterface宏返回保留接口模式或底层接口模式的返回值。 (译者按:其错误返回值非常浩大,请参见附件)
    如果程序不再调用这个宏所创建的接口,则必须用Release宏来释放它。 QueryInterface宏允许Microsoft或第三方来添加对象且不妨碍各个已经存在或将来的功能。
    这部分IUnknown 宏接口继承于对象。
    其他: 头文件:Unknwn.h

  3. Release,能使对象的关联值减少一。当值为零时,对象就被解除。

    ULONG Release();

    无参数
    返回值:返回一个新的关联值。这个值只在诊断或测试时有使用意义.
    注释:当关联值为零,对象将自行解除。使用AddRef宏使关联值增加一.
    这部分IUnknown 宏接口继承于对象。
    程序一定要用这个宏来释放IUnknown::AddRef, IUnknown::QueryInterface,所做的调用,或所创建的DirectDrawCreate。
    其他:

    头文件:Unknwn.h

  AddRefRelease宏控制对象的关联值。 例如:如果你创建一个DirectDrawSurface (译者按:DirectDraw平面,是一个对象,必须。将在以后的DirectDraw中具体说明) 对象,则关联值设置为一,当每次一个过程对于这个对象返回一个接口的指针时, 该过程必须调用AddRef通过该指针来增加关联值。你必须为每个AddRef调用设置一个相对应的Release。 在该指针被销毁前,你必须通过该指针来调用Release。在关联值变为0时, 这个对象变被销毁并且所有的接口都失效。

  QueryInterface宏用来确定一个对象是否提供一个特定的接口。 如果支持,QueryInterface返回这个接口的指针。然后你就可以使用这个接口的宏与该对象通信。 如果QueryInterface成功返回一个接口的指针,就会同时调用AddRef来增加关联值, 所以你的程序在销毁该接口的指针前调用Release来减少其关联值。


上篇|返回|下篇

Lucker 1998.12.11
E-Mail: fred_cai@kali.com.cn

附件:D3DERR.TXT QueryInterface宏返回的DirectX 3D保留接口模式及底层接口模式的返回值。


云风工作室 制作