本文对与microsoft directx 8.0版有关的常见开发问题进行解答,其中包括有关direct3d.directsound及directplay的章节.
1.一般性directx开发事宜 【程序编程相关:动态链接库-原理】
【推荐阅读:第二章 接口】答:您可能没有将 include 路径设置正确.许多编译器(microsoft visual c++)包含 sdk 的一个较早版本,因此如果您的 include 路径首先搜索标准的编译器 include 目录,则您会得到不正确版本的头文件.为解决这一问题,请确保 include 路径与库路径被设为搜索 directx include 与库路径.另请参见 sdk 中的dxreadme.txt 文件.如果您安装 directx sdk 而您又在使用 visual c++,则可以选择让安装程序为您设置各个 include 路径. 【扩展信息:如何用CRegKey类来操作注册表】
问:我在试图编译示例时,为何得到那么多错误消息?
问:我得到关于全局唯一标识符(guid)符号重复或缺失的连接器错误,怎么办?
答:您使用的各种 guid 应该得到一次性定义,且只能定义一次.如果您在插入 directx 头文件之前用 #define 定义 initguid 符号,则会插入 guid 的定义.因此,你应确保只对一个编译单元进行此类操作.这一方法的一个替代方案就是用 dxguid.lib 库进行连接,其中包含所有 directx guid 的定义.如果您使用这一方法(建议),则您永远不要通过 #define 定义 initguid 符号.
问:我能否将指针指向一个到较低版本号的 directx 接口?
答:不能.directx 接口属于 com 接口 .这意味着不要求将较高版本号的接口从相应的低版本号导出.因此, 获得到 directx 对象的一个不同接口的唯一安全方法就是使用接口的 queryinterface 方法.该方法是标准的 iunknown 接口的一部分,所有 com 接口必须从其导出.
问:我能在同一应用程序中将 directx 8 组件与directx 7 或更早的组件混用吗?
答:您可以随意混用不同版本的“不同组件”;例如,您可以在将 directplay 8 与 directdraw 7 用在同一应用程序中.但是,您通常不可以将“同一组件”的不同版本混用在同一应用程序中;例如,您不能混用 directdraw 7 与 direct3d 8 (鉴于这些实际上是同一组件,因为 directdraw 已被含入 directx 8 的 direct3d).
问:release 或 addref 方法的返回值有何含义?
答:返回值将是对象的当前参照计数.但是,com 规范声明,您不应依赖该返回值;该值通常仅供用于调试目的.您观察到的值可能并非所期待的,因为各种其它系统对象可能保持着对你所创建的 directx 对象的参照.因此,您不应编写反复调用 release 的代码,一直到参照计数为零,因为此时可以将对象释放,即使另一组件可能仍旧在对其进行参照.
问:我释放 directx 接口的次序很重要吗?
答:应当没有问题,因为 com 接口是参照计数的.但是,在某些 directx 版本中,接口的释放次序有一些已知的缺陷.安全起见,在可能的情况下,建议您以与创建时相反的次序释放接口.
问:智能指针是什么,我要用它们吗?
答:智能指针是一个 c++ 模板类,旨在封装指针功能.尤其有一些标准智能指针类,用于封装 com 接口指针.这些指针自动进行 queryinterface,而不是进行造型,并替您处理 addref 与 release.... 下一页