お世話になってます。
前回はこちらの掲示板に助けられ助かりました。ありがとうございました。
また質問です。
画像ファイルの画像を画面に表示させたいのですが、再描画で何回も繰り返し表示させる
と、途中から表示されなくなってしまいます。
いったん表示されなくなると、再描画をもういくらやっても表示されなくなってしまいま
す。
何がおかしいのでしょうか?
環境は、WinXP・VS2003、Win7・VS2012の両方で発生しました。
以下、ソースコードの抜粋です。
fileName…画像ファイルパス名
rect…表示領域座標
CPictureHolder *pBitmap = GetPicture(fileName);
if (pBitmap != NULL) pBitmap->Render(pDC, rect, rect);
delete pBitmap;
よろしくお願いします。
>CPictureHolder *pBitmap = GetPicture(fileName);
GetPicture()って何者でしょうか?
https://msdn.microsoft.com/ja-jp/library/office/ff864210.aspx
ではないですよね????
そして、そのGetPicture()が返却する型はCPictureHolderなんでしょうか??
>画像ファイルの画像を画面に表示させたいのですが、再描画で何回も繰り返し表示させる
>と、途中から表示されなくなってしまいます。
症状的にはリソースリークしているように見えますけど、システムモニタなどでのリソー
ス使用量はどうなっています?
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;
リソース使用量などはこれから調べてみます。
システムモニタ起動しましたが見方がわかりません。。。
「page/sec」ってなんじゃらほい?てな感じです。
解決には、どうしても見る必要ありますか?
pDispPicture->Release() が必要でしょうね。
CPictureHolder::SetPictureDispatch は内部で QueryInterface して参照カウントをイ
ンクリメントします。
この分はデストラクタでリリースされます。
OleLoadPictureFile で作成して SetPictureDispatch に渡している生の IPictureDisp
インターフェイスに対するリリースは明示的に書かなければなりません。
pDispPicture->Release()を追加したらできました。
aetosさん、ありがとうございます!
解決済みのようですが…
>システムモニタ起動しましたが見方がわかりません。。。
タスクマネージャでした。
プロセスタブを開いて、[表示][列の選択]から「GDIオブジェクト」とか選択します。
今回の場合だと「ハンドル」も増え続けたかも知れませんが。