2009-12-04 114 views
0
struct tagBITMAPINFO { 
    BITMAPINFOHEADER bmiHeader; 
    RGBQUAD    bmiColors[1]; 
} BITMAPINFO; 

tagBITMAPINFOHEADER{ 
     DWORD  biSize; 
     LONG  biWidth; 
     LONG  biHeight; 

} BITMAPINFOHEADER 


BITMAPINFO bmiCurrWindow; 

capGetVideoFormat((*m_pCapWndArray)[i].hCapWnd, &bmiCurrWindow, formatsize); 


CopyMemory(&(*m_pCapWndArray)[i].bmiHeader, &(bmiCurrWindow.bmiHeader), sizeof(BITMAPINFOHEADER)); 

bmiCurrWindow是一個結構'BITMAPINFO',它具有類型爲BITMAPINFOHEADER的成員'bmiHeader';windows中的copymemory()問題

複製內存後我想更改bmiCurrWindow的值。 即我想bmiCurrWindow.bmiHeader.biWidth = 480; bmiCurrWindow.bmiHeader.biHeight = 640;

但是,如果我寫上面的代碼,而執行它給我訪問voilation錯誤。

我該如何抵擋它?

+0

您確定capGetVideoFormat()工作嗎? – Guillaume 2009-12-04 09:51:15

+0

m_pCapWndArray是如何定義的? – 2009-12-04 10:20:58

回答

1

使用capGetVideoFormat()來調用它兩次的正確(和記錄)方式 - 一次獲取所需內存的大小,然後分配該大小的內存,然後再次調用它以填充內存。這是因爲BITMAPINFO :: bmiColors成員是可變長度的,所以你必須確保你有足夠的內存來接收所有的數據。您的代碼當前寫入的方式是在堆棧中分配一個BITMAPINFO,但實際的BITMAPINFO聲明僅爲其bmiColors成員中的1個RGBQUAD項目指定了空間。如果你的視頻格式有不止一種顏色,你就會損壞堆棧內存。您需要在堆上動態分配BITMAPINFO,例如:

DWORD dwSize = capGetVideoFormat((*m_pCapWndArray)[i].hCapWnd, NULL, 0); 
if (dwSize > 0) 
{ 
    BITMAPINFO *bmpInfo = (BITMAPINFO*) malloc(dwSize); 
    if (bmpInfo != NULL) 
    { 
    capGetVideoFormat((*m_pCapWndArray)[i].hCapWnd, bmpInfo, dwSize); 
    (*m_pCapWndArray)[i].bmiHeader = bmpInfo->bmiHeader; 
    } 
    free(bmpInfo); 
}