Direct2d CreateBitmapfromWICBitmap 在 ATL 中给出断言错误
Posted
技术标签:
【中文标题】Direct2d CreateBitmapfromWICBitmap 在 ATL 中给出断言错误【英文标题】:Direct2d CreateBitmapfromWICBitmap giving assert error within ATL 【发布时间】:2012-12-08 08:53:54 【问题描述】:我有一个简单的函数,它加载一个 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;
错误发生在 atlcomcli.h 函数 _NoAddRefReleaseOnCComPtr 的第 182 行。
我仔细检查了所有头文件和库,它们在两个项目中都是相同的(在第二个项目中有一些额外的头文件)。
这是有效的代码:
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,但是和第一个sn-p中的完全一样。
------------------- 已修复 --------------- -------------
我第三次忘记为我的渲染目标调用 init 函数。
【问题讨论】:
【参考方案1】:断言失败警告您正在尝试通过CComPtr
模板“使用”NULL
接口指针。您应该在调用堆栈上查找您所在的代码的确切行,以及哪个变量包含您希望为非 NULL 的 NULL 指针。或者,只需使用调试器单步执行您的代码。
【讨论】:
哇...我第三次忘记为我的渲染目标调用 init 函数了。以上是关于Direct2d CreateBitmapfromWICBitmap 在 ATL 中给出断言错误的主要内容,如果未能解决你的问题,请参考以下文章