У меня есть простая функция, которая загружает файл 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.
Ошибка подтверждения предупреждает вас о том, что вы пытаетесь «использовать» NULL
указатель интерфейса через CComPtr
шаблон. Вы должны посмотреть на стек вызовов, в какой именно строке вашего кода вы находитесь, и какая переменная содержит указатель NULL, который, как вы ожидаете, не равен NULL. Или иначе просто пошагово просматривайте свой код с помощью отладчика.
Других решений пока нет …