2011-10-24 54 views
2

我正在使用一個捕獲卡dll,它導出一個提供包含DIB的HGLOBAL句柄的函數。我想將這個DIB寫入一個文件。在我鎖定資源並檢索數據指針之後,我要求它的大小約爲1mb。但是當我將它寫入文件時,它總是0字節。這是我第一次使用HGLOBAL類型,所以我猜測我做錯了什麼。我感謝您的幫助。無法將HGLOBAL DIB數據寫入文件

char* dibData = (char*)LockResource(DIB); 
if(NULL != dibData) 
{ 
    SIZE_T dibSize = GlobalSize (DIB); 
    f = fopen("thedib.dib", "wb"); 

    if (f) 
    { 
     n = fwrite(dibData,dibSize,1,f); 
     fflush(f); 
     fclose(f); 
     wrote = true; 
    } 

    UnlockResource(DIB); 
} 
+0

'SizeofResource(DIB)'的結果是什麼? http://msdn.microsoft.com/en-us/library/windows/desktop/ms648048.aspx – user7116

+0

如果我做DWORD dibSize = SizeofResource(NULL,(HRSRC)DIB);那麼dibsize = 0。 – kevincw01

+0

我想知道是否LockResource甚至是必要的,因爲這個圖像不是來自可執行文件。 – kevincw01

回答

3

您似乎混合了資源API和全局內存API。如果它確實是一個資源,請使用LockResource(),SizeofResource(),UnlockResource()。如果它只是通過GlobalAlloc()分配的內存塊,請使用GlobalLock(),GlobalSize(),GlobalUnlock()。

此外,.bmp文件應以BITMAPFILEHEADER結構開頭。這種結構不適用於內存中的DIB,因此您需要在編寫DIB數據之前編寫該結構。

http://msdn.microsoft.com/en-us/library/dd183374%28v=vs.85%29.aspx

+0

如果我做'DWORD dibSize = SizeofResource(NULL,(HRSRC)DIB);'then dibsize = 0。如果我解決了這個問題,我一定會寫出位圖標題。 – kevincw01

+0

在LockResource(應該是GlobalLock?)之後設置一個斷點,並檢查'dibData'指向的內存。如果它是有效的DIB,則第一個DWORD將是40(0x28十六進制),這是BITMAPINFOHEADER的大小。 – cbranch

+0

我使用了GlobalLock並解決了這個問題。謝謝 – kevincw01