2011-10-24 7 views
2

私はDIBを含むHGLOBALハンドルを提供する関数をエクスポートするキャプチャカードdllを使用しています。このDIBをファイルに書きたいと思います。私はリソースをロックし、データポインタを取得した後、私はサイズを要求し、約1メガバイトです。しかし、ファイルに書き込むときは常に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);'を実行すると 'dibsize = 0。私がこの問題を解決したら、私はビットマップヘッダを必ず書きます。 – kevincw01

+0

LockResource(GlobalLock?)の直後にブレークポイントを設定し、 'dibData'が指すメモリを検査します。有効なDIBの場合、最初のDWORDはBITMAPINFOHEADERのサイズである40(0x28の16進数)になります。 – cbranch

+0

GlobalLockを使用して問題を修正しました。ありがとう – kevincw01

関連する問題