2011-08-23 53 views
1

我有一个COM组件。此COM组件在屏幕上显示图像。图像位通过一个缓冲区复制这样的:StretchBlt失败

IplImage iplimage = image; 

IplImage *img2 = cvCreateImage(cvGetSize(&iplimage), 
          iplimage.depth, 
          iplimage.nChannels); 

cvCopy(&iplimage, img2); 

memcpy(m_BackSurface.vpBits, img2->imageData, img2->width*img2->height*3); 

image是CV ::垫。在某些情况下,这是一个裁剪cv :: Mat,即。 raw_image(x0, y0, w, h)返回raw_image是另一个cv :: Mat。

后来应用程序调用StretchBlt来显示图像。

如果我运行的.NET应用程序内该COM组件(和当.NET应用程序中,这并不在一个纯粹的非托管环境中发生)调用StretchBlt失败时(同样,只有当)image已被裁剪。它在图像未被裁剪的代码路径上不会失败。两个代码路径的绘图代码都是相同的。 GetLastError()将返回错误8.

有人可以解释这个问题吗?

回答

2

错误代码8,according to MSDN对应于ERROR_NOT_ENOUGH_MEMORY。现在您正在.NET环境中运行,因为CLR已加载到您的进程中,所以可用内存较少。您应该尝试减少内存使用情况,并寻找内存泄漏

+0

Dario,谢谢。实际上,我没有签名int,它被大于自身的签名值减去后溢出,将垃圾数据提供给StretchBlt。你说过漏洞,我仔细查看代码并发现它。谢谢! –