Direct2d CreateBitmapfromWICBitmap, дающий ошибку подтверждения в ATL

У меня есть простая функция, которая загружает файл Png и возвращает его как ID2D1Bitmap. Но когда он пытается вызвать функцию CreateBitmapfromWicBitmap, он выдает ошибку отладки. Самое смешное, что я впервые сделал функцию загрузки изображений в отдельном проекте, и там он отлично работает. Обе эти функции имеют один и тот же код, а вторая выдает ошибки.

Вот код ошибки:

ID2D1Bitmap* Wnd::LoadPng(LPCWSTR Path) {
CComPtr<IWICBitmapDecoder> pDecoder;
CComPtr<IWICBitmapFrameDecode> pFrame;
CComPtr<ID2D1Bitmap> pBit;
CComPtr<IWICFormatConverter> pConv;
HRESULT Hr;

Hr = m_pWICFactory->CreateDecoderFromFilename(Path,NULL,GENERIC_READ,WICDecodeMetadataCacheOnDemand,&pDecoder);

if (SUCCEEDED(Hr)) {
Hr = m_pWICFactory->CreateFormatConverter(&pConv);
}

if (SUCCEEDED(Hr)) {
Hr = pDecoder->GetFrame(0,&pFrame);
}

if (SUCCEEDED(Hr)) {
Hr = pConv->Initialize(pFrame,GUID_WICPixelFormat32bppPBGRA,WICBitmapDitherTypeNone,0,0.f,WICBitmapPaletteTypeCustom);
}

if (SUCCEEDED(Hr)) {
Hr = m_pRT->CreateBitmapFromWicBitmap(pConv,0,&pBit);
}
return pBit;
}

Ошибка происходит в atlcomcli.h в строке 182 в функции _NoAddRefReleaseOnCComPtr.

Я дважды проверил все заголовки и библиотеки, и они одинаковы в обоих проектах (с некоторыми дополнительными заголовками во втором проекте).

Вот код, который работает:

        CComPtr<IWICFormatConverter> Conv;
m_pWICFactory->CreateFormatConverter(&Conv);
CComPtr<IWICBitmapFrameDecode> Frame;
m_pDecoder->GetFrame(0,&Frame);
Frame->GetSize(&W,&H);
Conv->Initialize(Frame,GUID_WICPixelFormat32bppPBGRA,WICBitmapDitherTypeNone,0,0.f,WICBitmapPaletteTypeCustom);
CComPtr<ID2D1Bitmap> Bit;
Hr = m_pRT->CreateBitmapFromWicBitmap(Conv,0,&Bit);
m_pBitmap.push_back(Bit);

BitmapDecoder здесь предопределен, но он точно такой же, как и в первом фрагменте.

——————————- ФИКСИРОВАННЫЙ —————————-

В третий раз я забыл вызвать функцию init для моей rendertarget.

0

Решение

Ошибка подтверждения предупреждает вас о том, что вы пытаетесь «использовать» NULL указатель интерфейса через CComPtr шаблон. Вы должны посмотреть на стек вызовов, в какой именно строке вашего кода вы находитесь, и какая переменная содержит указатель NULL, который, как вы ожидаете, не равен NULL. Или иначе просто пошагово просматривайте свой код с помощью отладчика.

0

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

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

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