0

PngファイルをロードしてID2D1Bitmapとして返す単純な関数があります。ただし、CreateBitmapfromWicBitmap関数を呼び出そうとすると、デバッグアサートエラーが発生します。面白いことに、私は最初に別のプロジェクトでimageload関数を作成しましたが、そこでは正常に機能します。これらの関数は両方とも同じコードを持っていますが、2番目の関数はエラーを出します。

エラーコードは次のとおりです。

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で発生します。

すべてのヘッダーとライブラリを再確認しましたが、両方のプロジェクトで同じです(2番目のプロジェクトにいくつかの追加のヘッダーがあります)。

動作するコードは次のとおりです。

        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はここで事前定義されていますが、最初のスニペットとまったく同じです。

- - - - - - - - - - - - - - - - 修繕 - - - - - - - - - ----------

3回目は、rendertargetのinit関数を呼び出すのを忘れました。

4

1 に答える 1

0

アサーションの失敗は、テンプレートNULLを介してインターフェイス ポインターを「使用」しようとしていることを警告します。CComPtrコードの正確な行、および非NULLであると予想されるNULLポインターを保持する変数をコールスタックで調べる必要があります。または、デバッガーを使用してコードをステップ実行するだけです。

于 2012-12-20T19:28:40.120 に答える