我有一个COM组件。这个COM组件在屏幕上显示一个图像。图像位通过如下的缓冲区复制:
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::Mat。在某些情况下,这是一个裁剪的cv::Mat。raw_image(x0, y0, w, h)
的返回,其中raw_image
是另一个cv::Mat.
之后,应用程序调用StretchBlt
来显示图像。
如果我在。net应用程序中运行这个COM组件(当在。net应用程序中,这不会在纯非托管环境中发生时,仅),当(再次,仅当)image
被裁剪时,对StretchBlt
的调用失败。它不会在没有裁剪图像的代码路径上失败。绘图代码对于两个代码路径是相同的。GetLastError()
将返回错误8.
错误码8,根据MSDN,对应ERROR_NOT_ENOUGH_MEMORY
。现在您在。net环境中运行,由于CLR被加载到您的进程中,因此可用内存较少。您应该尝试减少内存使用,并查找内存泄漏