C++ D3DXCreateTextureFromFileEx访问冲突(nvd3dum.dll)
我正试图创建一个游戏,我需要精灵,所以我建立了一个小的图像类,从一个文件创建纹理,但一些非常奇怪的事情正在发生 有时它可以工作(比如80%的时间),但有时它会因为以下错误而崩溃C++ D3DXCreateTextureFromFileEx访问冲突(nvd3dum.dll),c++,directx,directx-9,C++,Directx,Directx 9,我正试图创建一个游戏,我需要精灵,所以我建立了一个小的图像类,从一个文件创建纹理,但一些非常奇怪的事情正在发生 有时它可以工作(比如80%的时间),但有时它会因为以下错误而崩溃 Unhandled exception at 0x6BFC2B06 (nvd3dum.dll) in Application.exe: 0xC0000005: Access violation reading location 0x00000010. 我不认为英伟达驱动程序中有bug,而是在我的代码中。 我不能100
Unhandled exception at 0x6BFC2B06 (nvd3dum.dll) in Application.exe:
0xC0000005: Access violation reading location 0x00000010.
<>我不认为英伟达驱动程序中有bug,而是在我的代码中。
我不能100%确定问题是否存在于我的Image类中,但当我不创建任何图像时,它不会崩溃
我不知道如何精确定位错误的确切位置,我的Image类是否有问题,或者我应该去别处看看
CImage.h:
class CImage {
public:
CImage(COverlay* overlay, const char* fileName, int w, int h);
void draw(float x, float y, Color c = Color::White());
int getWidth();
int getHeight();
private:
COverlay* _overlay;
const char* _fileName;
int _w;
int _h;
LPDIRECT3DTEXTURE9 _texture;
LPD3DXSPRITE _sprite;
};
CImage.cpp:
CImage::CImage(COverlay* overlay, const char* fileName, int w, int h) {
_overlay = overlay;
_fileName = fileName;
_w = w;
_h = h;
int eCode;
if (FAILED(eCode = D3DXCreateTextureFromFileEx(overlay->GetDevice(), fileName, w, h, D3DX_DEFAULT, NULL, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0xFFFF00FF, NULL, NULL, &_texture))) {
std::string error_msg = "There was an error creating the texture for an image. Make sure the file is available. Requested file: ";
error_msg += fileName;
error_msg += ", Error: ";
switch (eCode) {
case D3DERR_INVALIDCALL:
error_msg += "D3DERR_INVALIDCALL";
break;
case D3DERR_NOTAVAILABLE:
error_msg += "D3DERR_NOTAVAILABLE";
break;
case D3DERR_OUTOFVIDEOMEMORY:
error_msg += "D3DERR_OUTOFVIDEOMEMORY";
break;
case D3DXERR_INVALIDDATA:
error_msg += "D3DXERR_INVALIDDATA";
break;
case E_OUTOFMEMORY:
error_msg += "E_OUTOFMEMORY";
break;
}
error_msg += ".";
MessageBox(NULL, error_msg.c_str(), "Error", NULL);
exit(1);
}
if (FAILED(D3DXCreateSprite(overlay->GetDevice(), &_sprite))) {
MessageBox(NULL, "There was an error creating a DirectX sprite.", "Error", NULL);
exit(1);
}
}
void CImage::draw(float x, float y, Color c) {
if (_texture && _sprite) {
_sprite->Begin(D3DXSPRITE_ALPHABLEND);
D3DXVECTOR3 pos = { x, y, 0 };
_sprite->Draw(_texture, NULL, NULL, &pos, c.Code());
_sprite->End();
}
}
int CImage::getWidth() {
return _w;
}
int CImage::getHeight() {
return _h;
}
用于创建图像的代码(当注释掉此代码时,应用程序不会崩溃):
任何帮助都将不胜感激。在调试器中运行程序。当或如果它崩溃时,您将通过检查调用堆栈了解导致问题的代码行。无论如何,当您编写这样的代码时,您应该熟悉调试器以及如何正确使用它。您传递到D3DXCreateTextureFromFileEx()的一些参数不正确,您应该阅读文档Hmmm<代码>新CImage(../plaatjes/box_header.png),152,40)代码>3个参数<代码>CImage(COverlay*overlay,const char*fileName,int w,int h)代码>4个参数。这里有点不对劲。您的构造函数有4个参数,但您正在创建带有3个参数的
CImage
实例。我实际上使用了一个包装器进行初始化,但我很快就在这里删除了它。我使用一个调试器,它无法识别一行代码,因为它发生在外部代码中。@J.vanDijk当崩溃发生时,查看调用堆栈,查看程序所做的导致错误的调用。
CMenuBox::_boxHeader = new CImage("../plaatjes/box_header.png", 152, 40);
CMenuBox::_boxPattern = new CImage("../plaatjes/box_pattern.png", 152, 1);
CMenuBox::_boxBottom = new CImage("../plaatjes/box_bottom.png", 152, 16);
CMenuBox::_boxDivider = new CImage("../plaatjes/divider.png", 134, 2);