Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ D3DXCreateTextureFromFileEx访问冲突(nvd3dum.dll)_C++_Directx_Directx 9 - Fatal编程技术网

C++ D3DXCreateTextureFromFileEx访问冲突(nvd3dum.dll)

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

我正试图创建一个游戏,我需要精灵,所以我建立了一个小的图像类,从一个文件创建纹理,但一些非常奇怪的事情正在发生

有时它可以工作(比如80%的时间),但有时它会因为以下错误而崩溃

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);