画像が途中から表示されなくなります。

[戻る]
困ってます 2015/08/17(月) 09:53:55
お世話になってます。
前回はこちらの掲示板に助けられ助かりました。ありがとうございました。

また質問です。
画像ファイルの画像を画面に表示させたいのですが、再描画で何回も繰り返し表示させる
と、途中から表示されなくなってしまいます。
いったん表示されなくなると、再描画をもういくらやっても表示されなくなってしまいま
す。
何がおかしいのでしょうか?

環境は、WinXP・VS2003、Win7・VS2012の両方で発生しました。

以下、ソースコードの抜粋です。
fileName…画像ファイルパス名
rect…表示領域座標

    CPictureHolder         *pBitmap = GetPicture(fileName);
    if (pBitmap != NULL)    pBitmap->Render(pDC, rect, rect);
    delete pBitmap;

よろしくお願いします。

瀬戸っぷ [E-Mail] 2015/08/17(月) 10:14:52
>CPictureHolder         *pBitmap = GetPicture(fileName);

GetPicture()って何者でしょうか?

https://msdn.microsoft.com/ja-jp/library/office/ff864210.aspx
ではないですよね????

そして、そのGetPicture()が返却する型はCPictureHolderなんでしょうか??

>画像ファイルの画像を画面に表示させたいのですが、再描画で何回も繰り返し表示させる
>と、途中から表示されなくなってしまいます。

症状的にはリソースリークしているように見えますけど、システムモニタなどでのリソー
ス使用量はどうなっています?

困ってます 2015/08/17(月) 10:36:05
GetPictureは自前の関数↓でした。

CPictureHolder *GetPicture(CString& ImageFileName)
{
    LPDISPATCH    pDispPicture;
    COleVariant    OleFileName(ImageFileName);
    CPictureHolder    *pPicture;

    if(OleLoadPictureFile(OleFileName, &pDispPicture) >= 0) {
        pPicture = new CPictureHolder();
        pPicture->SetPictureDispatch((LPPICTUREDISP)pDispPicture);
        return pPicture;
    }

    return NULL;
}


GetPictureを使わずに以下のように処理しても同様でした。

    COleVariant        varName(fileName);
    LPDISPATCH        pDisp;
    CPictureHolder    *pPicture = new CPictureHolder;
    OleLoadPictureFile(varName, &pDisp);
    pPicture->SetPictureDispatch((LPPICTUREDISP)pDisp);
    pPicture->Render(pDC, rect,rect);
    delete pPicture;

リソース使用量などはこれから調べてみます。

困ってます 2015/08/17(月) 11:00:41
システムモニタ起動しましたが見方がわかりません。。。
「page/sec」ってなんじゃらほい?てな感じです。
解決には、どうしても見る必要ありますか?

aetos 2015/08/17(月) 14:17:10
pDispPicture->Release() が必要でしょうね。

CPictureHolder::SetPictureDispatch は内部で QueryInterface して参照カウントをイ
ンクリメントします。
この分はデストラクタでリリースされます。
OleLoadPictureFile で作成して SetPictureDispatch に渡している生の IPictureDisp 
インターフェイスに対するリリースは明示的に書かなければなりません。

困ってました 2015/08/17(月) 15:01:26
[[解決]]
pDispPicture->Release()を追加したらできました。
aetosさん、ありがとうございます!

瀬戸っぷ [E-Mail] 2015/08/17(月) 22:50:46
解決済みのようですが…

>システムモニタ起動しましたが見方がわかりません。。。

タスクマネージャでした。
プロセスタブを開いて、[表示][列の選択]から「GDIオブジェクト」とか選択します。
今回の場合だと「ハンドル」も増え続けたかも知れませんが。

古いスレッドには追加発言できません。