イメージファイルの保存と読込みがうまくいかないので、お願いします。(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にも普通あるのですよね??
> ar.Write(pstm, (UINT)lBytes );
書き込むべきなのは、pvData が指す先では?
目からうろこ!ありがとうございます!!