※ 引述《iamstudent (stu)》之铭言:
: 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: VC++
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: DirectX
: 问题(Question):
: 在编译一个比较古老的DirectX程式时
: 我去抓了比较旧版的DirectX SDK来安装 (2010 Feb)
: 编译可以过,连接也可以过
: 但是一执行就会出现错误讯息
: 分两个错误讯息窗出来
: 第一个是:
: The D3D device has a non-zero referecne count,
: meaning some objects were not released.
: 关掉之后会出现第二个
: 第二个则是:
: Failed creating Direct3D device objects.
基本上这种错误是因为编译/执行时include/lib/dll版本不一致的结果。
DirectX的版本问题常常是个麻烦,扯上D3DX更是麻烦(如D3DX9_xx.dll版本)。最好找你
手上DirectX程式当时所用的DirectX SDK,如果没有也建议尽量找旧一点的版本。
Build 时要确定include和lib都要依DirectX SDK -> (Windows SDK) -> Visual C的优先
顺序。
执行时更要把PATH设好,用Process Explorer之类的确定用的是该DirectX SDK runtime
的DLL。
: 我第一个动作是上google去查这两个错误讯息
: 结果并不是查不到,而是找到很多解答但是都没有发挥效果
: 有的是游戏讨论文章,说要更新显示卡驱动或是换一张比较好的显示卡
: 但是这点我可以直接排除掉
: 显卡驱动到最新而且显卡也很新(GTX670)
: 另外一个方向则是更新DirectX
: 上网查了一下,想试试看使用新版的SDK
: 才发现到DX SDK已经被合并到Windows SDK去了
: DirectX SDK最新只到2010年就没有了
: 改安装windows SDK
: 然后发现旧版的程式有很多include档名都要改
: 例如"d3dx9.h"要改成"d3d9.h"
: 但是最令人崩溃的地方在于有的head档并不是更名,而是整个消失了!
: 直接注解掉也不行,肯定需要更改
: 这里想请教对于DirectX比较熟悉的前辈
: 对于比较旧的DirectX程式应该要怎么编译?
: 我目前想到的方向有两个
: 1 用新版SDK,但是程式要大改
: 2 用旧版SDK,但是目前程式跑不起来,会出现最前面的错误讯息
: 另外,我还做了一个测试
: 把旧版DirectX SDK里面的dll删除
: 看看程式执行起来是否会出现找不到dll的错误讯息
: 结果却是不会发生找不到dll,只出现最前面的device错误
: 所以我猜系统里面应该哪里也有这些dll档
: 所以我是用安装的SDK编译与连结,但是用不同版本的dll执行
: 可是已经搜索了整个C:
: 并没有发现到其他DX dll档案
: windows系统会去寻找windows, system32, PATH这些地方是否有dll档
: 但是我没有找到它们,完全无法理解程式是怎么被执行起来的
: 就连是否执行到错误版本的dll也不确定
如上面所说,用process explorer看看
: 但是感觉上应该是这样
: 有在VC专案设定dll的资料夹到DirectX SDK的dll资料夹内
这要请你说明清楚一点是哪一个设定?
Project Properties -> Configuration Properties -> C/C++ -> General ->
Additional Include Directories要加DirectX SDK的include到最前面
Project Properties -> Configuration Properties -> Linker -> General ->
Additional library Directories要加DirectX SDK的lib到最前面
如果要在Visual Studio里执行:
Project Properties -> Configuration Properties -> Debugging -> Environment要设
PATH,加DirectX SDK runtime到最前面
如果还是不行,请po
1. Project Properties -> Configuration Properties -> C/C++ -> Command Line内容
2. Project Properties -> Configuration Properties -> Linker -> Command Line内
容
3. 执行时Process Explorer看到的DLL list(要含Path)
: 但是感觉没有效果,似乎有个优先权更高的设定不知道在系统哪里