2011-08-23 61 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。你說過漏洞,我仔細查看代碼並發現它。謝謝! –