大家帮分析一下错误出现的原因,谢谢!static UINT GifThread(LPVOID gifDC)
{
CDC* pdc = (CDC*)gifDC;
HINSTANCE handle = ::AfxGetResourceHandle();
HRSRC hrsrc = ::FindResource(handle,MAKEINTRESOURCE(IDR_MYGIF),"GIF");
    DWORD word = ::SizeofResource(handle,hrsrc);
    BYTE* lpBy = (BYTE*)LoadResource(handle,hrsrc);
BYTE* pByte[20];
DWORD nu[20];
int num = 0;
DWORD firstLocation = 0;
for(DWORD j=0;j<word;j++)
{
if(lpBy[j]==0x2c)
{
if(lpBy[j-1]==0x00)
{

if(num==0)
{
                    firstLocation = j;
}
                PGifImage nowImage = (PGifImage)&lpBy[j+1];
if(nowImage->Flag.a==0)
{
DWORD number = 1+sizeof(GifImage);
while(lpBy[j+number]!=0)
{
    number = number+(DWORD)lpBy[j+number]+1;
}
number++;
pByte[num] = new BYTE[number];
for(DWORD n=0;n<number;n++)
{
*(BYTE*)(pByte[num]+n) = lpBy[j+n];
}
nu[num] = number;
j = j+number-1;
num++;
}
else
{
int number = 1+sizeof(GifImage)+1+3*(int)floor(pow(2,nowImage->Flag.d));
while(lpBy[j+number]!=0)
{
    number = number+lpBy[j+number];
}
pByte[num] = new BYTE[number];
for(int n=0;n<number;n++)
{
*(BYTE*)(pByte[num]+n) = lpBy[j+n];
}
nu[num] = number;
j = j+number-1;
num++;
}
}
}
}
int i = 1;
while(i)
{
for(int m=0;m<num;m++)
{
CBrush brush(RGB(255,255,255));
pdc->FillRect(CRect(0,0,500,500),&brush);
DWORD DDD;
VirtualProtect(lpBy,word,PAGE_READWRITE,&DDD);
            for(DWORD n=0;n<nu[m];n++)
{
lpBy[firstLocation+n] = *(BYTE*)(pByte[m]+n);
}
VirtualProtect(lpBy,word,DDD,NULL);
/*
        CMemFile file(lpBy,word);
CArchive ar(&file,CArchive::load|CArchive::bNoFlushOnDelete);
            CArchiveStream arcstream(&ar);
            */

CMemFile file(lpBy , word);
IStream *pStm; 
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, word); 
LPVOID pvData = NULL;
if (hGlobal != NULL) 

if ((pvData = GlobalLock(hGlobal)) != NULL) 
{

memset(pvData , NULL , 5000);
// file.Read(pvData, word); 
pvData = lpBy;
GlobalUnlock(hGlobal); 
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);//创建流有问题,后面好像有乱码
}
} CComQIPtr<IPicture> m_picture;
HRESULT hr = OleLoadPicture((LPSTREAM)&pStm,0,false,IID_IPicture,(void**)&m_picture);//在这里抛出异常
long a,b;
m_picture->get_Width(&a);
m_picture->get_Height(&b);
CSize sz(a,b);
pdc->HIMETRICtoDP(&sz);
CRect rect;
m_picture->Render(*pdc,0,0,sz.cx,sz.cy,0,b,a,-b,&rect);
Sleep(100);
}
}
return 1;
}

解决方案 »

  1.   

    memset(pvData , NULL , 5000); // 为什么一定是5000,你就不怕越界或者初始化长度不足?其实你完全可以这样:
    CMemFile file(m_pGifData, m_nGifSize);
    CArchive ar(&file, CArchive::load|CArchive::bNoFlushOnDelete);
    CArchiveStream arcstream(&ar);
    CComQIPtr<IPicture> iPics;
    HRESULT hr = OleLoadPicture((LPSTREAM)&arcstream, 0, false, IID_IPicture, (void**)&iPics);