Указатель NULL, думал, что он инициализирован

я получил

Debug assertion failed.
p!=0

и это указывает на:

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

в ‘atlcomcli.h’

Из того, что я понимаю, это означает, что я забыл инициализировать указатель где-то, но все они казаться быть инициализированным.

Когда я использую обычные указатели вместо «CComPtr», он выбрасывает «Место чтения нарушения доступа» в «font-> DrawTextA» в «D3DFont :: Draw» в D3DFont.cpp

//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, поэтому я думаю, что это должно быть связано с ним. Обновлю, когда у меня будет больше информации.

2

Решение

Вызов D3DX10CreateFontIndirect на самом деле не гарантирует, что ваш указатель будет инициализирован.

Правило большого пальца: ВСЕГДА проверяйте HRESULTs при использовании функций DirectX, которые инициализируют указатель:

HRESULT hr = D3DX10CreateFontIndirect(device, &fd, &font);

if(FAILED(hr)){
//Get the last error, display a message, etc.
//Eventually propagate the error if the code can't continue
//with the font pointer uninitialized.
}

Когда ваша функция возвращается E_FAIL, не пытайтесь использовать указатель позже. Есть большие шансы, что значения параметров просто неверны (здесь указатель вашего устройства может быть нулевым или описание шрифта может быть неправильным).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]