2

私は得る

Debug assertion failed.
p!=0

そしてそれは次を指します:

    _NoAddRefReleaseOnCComPtr<T>* operator->() const throw()
    {
        ATLASSERT(p!=NULL);
        return (_NoAddRefReleaseOnCComPtr<T>*)p;
    }

「atlcomcli.h」で

私が理解していることから、どこかでポインターを初期化するのを忘れていましたが、それらはすべて初期化されているようです

「CComPtr」の代わりに通常のポインターを使用すると、D3DFont.cpp の「D3DFont::Draw」の「font->DrawTextA」で「Access Violation Reading Location」がスローされます。

//D3DFont.h:
#include <D3DX10.h>
#include <atlbase.h>
#include <string>

class D3DFont
{
public:
    D3DFont(void);
    ~D3DFont(void);

    bool Create(ID3D10Device *device, std::string name, int width,
        int height, int weight, int mipLevels, bool italic, BYTE charset,
        BYTE quality, BYTE pitchAndFamily);
    void Draw(LPD3DX10SPRITE sprite, std::string text, int charCount,
        LPRECT rect, UINT format, D3DXCOLOR color);

private:
    CComPtr<ID3DX10Font> font;
};

//D3DFont.cpp:
#include "D3DFont.h"

D3DFont::D3DFont(void){} 
D3DFont::~D3DFont(void){}

bool D3DFont::Create( ID3D10Device *device, std::string name,
    int width, int height, int weight, int mipLevels, bool italic,
    BYTE charset, BYTE quality, BYTE pitchAndFamily )
{
    D3DX10_FONT_DESC fd;
    ZeroMemory(&fd, sizeof(D3DX10_FONT_DESC));

    fd.Height = height;
    fd.Width = width;
    fd.Weight = weight;
    fd.MipLevels = mipLevels;
    fd.Italic = italic;
    fd.CharSet = charset;
    fd.Quality = quality;
    fd.PitchAndFamily = pitchAndFamily;

    strcpy_s(fd.FaceName, name.c_str());

    // INITIALIZING FONT HERE
    D3DX10CreateFontIndirect(device, &fd, &font);

    return true;
}

void D3DFont::Draw( LPD3DX10SPRITE sprite, std::string text,
    int charCount, LPRECT rect, UINT format, D3DXCOLOR color )
{
    // ERROR HERE
    font->DrawTextA(sprite, text.c_str(), charCount, rect, format, color); 
}

そして、上記の関数の私の使用:

if( !font.Create(d3d.GetDevice(), "Impact", 0, 175, 0, 1, false,
    OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE) )
{
    MessageBox(0, "Could not create font.", "Error!", MB_OK | MB_ICONERROR);
}

// later on...

RECT r = {35, 50, 0, 0};
font.Draw(0, "Test", -1, &r, DT_NOCLIP, d3d.GetColorObj(1.0f, 1.0f, 0.0f, 1.0f));

何を見逃す可能性がありますか?


'D3DX10CreateFontIndirect' は 0x8876086C をスローします。意味がわかりませんが、いくつかの Google スレッドは d3dDevice に関連しているので、関連しているに違いないと思います。詳細がわかり次第更新します。

4

1 に答える 1