这部分描述了构件对象模型(COM) (译者按:构件对象模型是从OLE中派生出来的一种结构) 及它是如何实现DirectX目标及接口,分以下几部分:
大多数的DirectX API的对象及接口都是基于构件对象模型。 构件对象模型是建立在一个使用面向对象的系统之上的, 这就是构件对象模型程序的核心模式。这也是一个可以创建多个接口的接口。 它是一个操作系统级的对象模型。
许多DirectX API都是以构件对象模型为标准而创建的。你可以这样理解: 一个对象就象一个黑盒子记录了硬件及应用程序通过一个接口所进行的所需的通讯。 命令送到或接收自一个通过构件对象模型接口的对象,这就叫做宏。 例如:IDirectDraw4::GetDisplayMode宏是通过IDirectDraw4接口从 DirectDraw对象来获得当前显示适配器的显示模式。
在运行时一个对象可以与另一个对象相互捆绑, 也可以使用其他对象所提供的接口。如果你知道对象是构件对象模型对象, 并知道这个对象所支持的接口,你的应用程序(或另一个对象) 便可决定第一对象所能提供的服务。所有的构件对象模型的对象都能继承一个宏, 查询接口宏,能让你决定对象提供的接口并为这些接口创建指针。 要获得关于这个宏更多的信息,详见 IUnknown 接口。
所有的构件对象模型(以下简称COM)接口都是从一个叫IUnknown 的接口派生出来的。这个接口使DirectX能一直控制对象并有能力操作更复杂的接口。 IUnknown有以下三个宏:
IUnknown::AddRef
ULONG AddRef();
无参数
返回值:返回一个新的关联值。这个值只在诊断或测试时有使用意义。
注释:当对象被创建,它的关联值被设置为1。
每次应用程序获得对象的接口或调用AddRef宏时,
这个对象的关联值会增加一。可以使用Release宏来使对象的关联值减一。
这部分IUnknown 宏接口继承于对象.
其他:
Windows NT: 需要3.1或更高版本
Windows: 需要Windows 95或更高版本
Windows CE: 不支持
头文件:Unknwn.h
HRESULT QueryInterface(REFIID riid, LPVOID* obp);
参数:
ULONG Release();
无参数
返回值:返回一个新的关联值。这个值只在诊断或测试时有使用意义.
注释:当关联值为零,对象将自行解除。使用AddRef宏使关联值增加一.
这部分IUnknown 宏接口继承于对象。
程序一定要用这个宏来释放IUnknown::AddRef,
IUnknown::QueryInterface,所做的调用,或所创建的DirectDrawCreate。
其他:
AddRef和Release宏控制对象的关联值。 例如:如果你创建一个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保留接口模式及底层接口模式的返回值。