IPictureを使った保存と読込 – プログラミング – Home

IPictureを使った保存と読込
 
通知
すべてクリア

[解決済] IPictureを使った保存と読込


らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
Topic starter  

イメージファイルの保存と読込みがうまくいかないので、お願いします。(VC6)
ソースは必要なところだけ取り出しますと、以下になります。
(エラー処理についてはまだ途中です)

class CMyImage : public CObject
{
public:
DWORD m_dwFileSize;
LPPICTURE m_pPicture;

CMyImage()
{
m_dwFileSize = 0;
m_pPicture = NULL;
}

//---------------------------------------
BOOL CMyImage::_loadfile( CString& FileName )
{
BOOL rtv;
CFile fp;

if ( m_pPicture )
{
m_pPicture->Release();
m_pPicture = NULL;
}

m_pPicture = NULL;
BOOL bret = fp.Open( FileName, CFile::modeRead);
if( bret == FALSE)
{
//AfxMessageBox( open file error!);
return FALSE;
}
m_dwFileSize = fp.GetLength();
CArchive ar( &fp, CArchive::load, m_dwFileSize );
rtv = this->LoadIPicture( ar );
fp.Close();
return rtv;
}

//---------------------------------------
BOOL CMyImage::LoadIPicture( CArchive& ar )
{
BOOL rtv = FALSE;
if(NULL != m_pPicture)
m_pPicture->Release();

// DWORD m_dwFileSize;
// ar >> m_dwFileSize;
if ( m_dwFileSize == 0 )
{
rtv = TRUE;
goto exit;
}
else
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,
m_dwFileSize);
if(NULL == hGlobal)
AfxThrowMemoryException();

LPVOID pvData = GlobalLock(hGlobal);
if(NULL == pvData)
AfxThrowMemoryException();

ar.Read(pvData, (UINT)m_dwFileSize);

GlobalUnlock(hGlobal);

LPSTREAM pstm = NULL;
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE,
&pstm);
if(!(SUCCEEDED(hr) && pstm))
AfxThrowMemoryException();

hr = ::OleLoadPicture(pstm, m_dwFileSize, FALSE,
IID_IPicture, (LPVOID
*)&m_pPicture);
if(!(SUCCEEDED(hr) && m_pPicture)) //←★
AfxThrowMemoryException();

pstm->Release();
rtv = TRUE;
}

exit:
return rtv;
}

//---------------------------------------
BOOL CMyImage::SaveIPicture( CArchive& ar )
{
BOOL rtv = FALSE;

if ( m_dwFileSize == 0 ||
m_pPicture == NULL )
{
ar << 0;
rtv = TRUE;
goto exit;
}

{

HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,
m_dwFileSize );
if(NULL == hGlobal)
::AfxThrowMemoryException();

LPVOID pvData = GlobalLock(hGlobal);
if(NULL == pvData)
::AfxThrowMemoryException();

LPSTREAM pstm = NULL;
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE,
&pstm);
if(!(SUCCEEDED(hr) && pstm))
::AfxThrowMemoryException();

LONG lBytes=0;
hr = m_pPicture->SaveAsFile(pstm, FALSE, &lBytes);
if(hr != S_OK)
::AfxThrowMemoryException();

if ( lBytes == 0 )
{
ar << 0;
}
else
{
ar << (DWORD)lBytes;
//ar.Write(pstm, (UINT)m_dwFileSize);
ar.Write(pstm, (UINT)lBytes );
}
GlobalUnlock(hGlobal);

pstm->Release();
rtv = TRUE;
}

exit:
return rtv;
}

void CMyImage::Serialize(CArchive& ar)
{
if( ar.IsStoring() )
{
SaveIPicture(ar);
}
else
{
ar >> m_dwFileSize;
LoadIPicture(ar);
}
}

//---------------------------------------
//<その他省略>
}

①_loadfile( CString& FileName )でファイルパスを指定しての
読込みLoadIPicture( CArchive& ar )は成功し、Renderでただしく表示します。
②ドキュメントの保存するときにSerializeが呼ばれ、
SaveIPicture( CArchive& ar )も無事通過します。
③保存したドキュメントを読込みするときにSerializeが呼ばれ、
読込みLoadIPicture( CArchive& ar )でマークの行(//←★)で
エラーになります。m_pPictureが0になっています。
どこか使い方を間違えているのでしょうか?

PS。ちなみにCPictureなるクラスが存在するようなのですが、
私の環境でヘルプにもCPictureがありません。CPicture.hなるファイルも
存在していません。VC6にも普通あるのですよね??


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> ar.Write(pstm, (UINT)lBytes );

書き込むべきなのは、pvData が指す先では?


返信引用
らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
Topic starter  

目からうろこ!ありがとうございます!!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました