刚接触图像处理不久,对C++ 的内存分配也不是很清楚
这段是我的程序中的一段,经过测试后发现问题就在这段,请高手帮我看看
lpDIB=(LPBYTE)GlobalLock(hNewDib);
dwSize=DIBlockSize(lpDIB);//新图像的总大小
hDib=GlobalReAlloc(hDib,dwSize,0);
lpbi=(BITMAPINFO*)GlobalLock(hDib);
CopyMemory((LPBYTE)lpbi,(LPBYTE)lpDIB,dwSize);
GlobalUnlock(hNewDib);
GlobalFree(hNewDib);
这段代码是一个函数的一部分,其中hNewDib是调用另一个函数的返回值得到的,是一个新的图像,我想做的就是把这个图像再拷贝到原来图像hDib中,hDib是一个全局变量。但加了这段代码后发现程序有问题了。后来用到lpDIBHdr=(LPBYTE)GlobalLock(hDIB),发现返回的lpDIBHdr是空值。但是最开始运行的几次都通过了,这个问题时后来出现的,就一直没有通过。当我注释掉上段程序的最后一句代码时,程序就能通过。请教各位高手,是不是GlobalReAlloc用的不对呢,到底错在哪里了,这个函数应该怎么用????
5 个解决方案
hDib=GlobalReAlloc(hDib,dwSize,0);
参数和返回值是相同的,不对吧。
我是提问者,谢谢楼上的回答,我也试过把重新分配的返回值赋给另一个变量,但是还是产生无效的地址。再次注释掉GlobalFree(hNewDib);时,就通过了。
我想你这个hNewDib内存块里面有指针值,CopyMemory只能拷贝指针值,而没有拷贝指针指向的内存。
hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
pvData = GlobalLock(hGlobal);//锁定分配内存块
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//装入图形文件
OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);