0

我有一个简单的函数,它加载一个 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 在这里预定义,但它与第一​​个片段中的完全相同。

- - - - - - - - - - - - - - - - 固定的 - - - - - - - - - ----------

第三次我忘记为我的渲染目标调用初始化函数。

4

1 回答 1

0

断言失败警告您正在尝试通过模板“使用”NULL接口指针。CComPtr您应该在调用堆栈上查找您所在的代码的确切行,以及哪个变量包含您希望为非 NULL 的 NULL 指针。或者,只需使用调试器单步执行您的代码。

于 2012-12-20T19:28:40.120 回答