BOOL CPicture::LoadPictureData(char *pBuf, DWORD dwSize)
{
/*申请内存,得到新分配内存的句柄*/
HGLOBAL hGlobal = GlobalAlloc(GHND, dwSize);
if (hGlobal == NULL)
{
return FALSE;
}
char *pData = (char*)GlobalLock(hGlobal);
memcpy(pData, pBuf, dwSize);
GlobalUnlock(hGlobal); /*将数据载入IPicture接口*/
IStream *pStream = NULL;
BOOL bResult = FALSE;
if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK)//创建数据流
{//从流中载入图象数据
if (OleLoadPicture(pStream, dwSize, FALSE, IID_IPicture, (LPVOID*)(&m_pPict)) == S_OK)
{
bResult = TRUE;
}
}
pStream->Release();
pStream = NULL;
GlobalFree(hGlobal);
hGlobal = NULL; return bResult;
}以上代码在大多数情况下正常,但是如果pBuf指向的图象数据被破坏了就出问题了。
问题出在OleLoadPicture函数一直不返回结果,程序就停止在那里不动了。
请各位大虾献计献策帮忙解决。类CPicture的定义:
class CPicture : public CPictureHolder
{
/*申请内存,得到新分配内存的句柄*/
HGLOBAL hGlobal = GlobalAlloc(GHND, dwSize);
if (hGlobal == NULL)
{
return FALSE;
}
char *pData = (char*)GlobalLock(hGlobal);
memcpy(pData, pBuf, dwSize);
GlobalUnlock(hGlobal); /*将数据载入IPicture接口*/
IStream *pStream = NULL;
BOOL bResult = FALSE;
if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK)//创建数据流
{//从流中载入图象数据
if (OleLoadPicture(pStream, dwSize, FALSE, IID_IPicture, (LPVOID*)(&m_pPict)) == S_OK)
{
bResult = TRUE;
}
}
pStream->Release();
pStream = NULL;
GlobalFree(hGlobal);
hGlobal = NULL; return bResult;
}以上代码在大多数情况下正常,但是如果pBuf指向的图象数据被破坏了就出问题了。
问题出在OleLoadPicture函数一直不返回结果,程序就停止在那里不动了。
请各位大虾献计献策帮忙解决。类CPicture的定义:
class CPicture : public CPictureHolder
{
if (SUCCEEDED(OleLoadPicture(pStream, dwSize, FALSE, IID_IPicture, (LPVOID*)(&m_pPict)))
...
}
catch(...)
{
...
}
2.图象文件被破坏是指文件的数据不完整,不是指该文件是一个非图象文件;
3.OleLoadPicture函数在对2中的图象进行载入时,函数不返回任何结果,通过设置断点会发现程序停在了OleLoadPicture函数处,不再往下继续运行了。好象是OleLoadPicture函数内部停在了某个点上。
圖像文件格式被破壞後, 調用OleLoadPicture
在Win2000下會導致無響應,
WinXP下正常,我也找了很久, 沒能搞定,
最後當作OS 接口的Bug了事.
不會死,
Win2000就會執行不下去,我的開發機器用的是XP,
所以在測試組測試時才發現.此題目前無解丫,
sigh...
http://support.microsoft.com/default.aspx?scid=kb;en-us;326646
324490 FIX: Corrupted GIF Images May Cause an Access Violation in OLE
http://support.microsoft.com/default.aspx?scid=kb;en-us;324490