我有一个简单的函数,它加载一个Png文件并将其作为ID2D1Bitmap返回。但是当它尝试调用CreateBitmapfromWicBitmap函数时,它会产生调试断言错误。有趣的是,我首先在一个单独的项目中创建了一个imageload函数,它在那里工作得很好。这两个函数都有相同的代码,而第二个函数则给出错误。
这是错误代码:
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;
}
错误发生在函数_NoAddRefReleaseOnCComPtr第182行的atlcomcli.h中。
我仔细检查了所有标题和库,它们在两个项目中都是相同的(在第二个项目中有一些额外的标题)。
以下是WORKS的代码:
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,但它与第一个代码段完全相同。
------------------------------- FIXED --------------- -------------
我第三次忘记为我的rendertarget调用init函数。
答案 0 :(得分:0)
断言失败警告您,您正试图&#34;使用&#34;通过NULL
模板的CComPtr
接口指针。您应该查看调用堆栈,其中包含您所在代码的确切行,以及哪个变量包含您希望为非NULL的NULL指针。或者只是使用调试器逐步执行代码。