2011-10-17 27 views
3

API関数CreateFileMapping(...)の使い方に問題があります。CreateFileMappingが「ディスク容量不足」エラーで終了するエラー

私は小さなファイルをマップしてから内容を逆転しようとしています。それは約1Kbしかありませんが、私は "Not enough memory"エラーを受けています。

CreateFileを呼び出してファイルを開いて、サイズをGetFileSizeにしました。

それから私は呼ん:

CreateFileMapping(fileHandle, 
        NULL, 
        PAGE_READWRITE | SEC_RESERVE, 
        fileSize + 1, 
        fileSize + 1, 
        NULL); 

私は問題がdwFileOffsetHighdwFileOffsetLowとしてfileSize + 1を渡すことであると思われるが、私は私ではなく、それに渡すべきか理解するのに苦労しています。

ご迷惑をおかけして申し訳ありません。

答えて

5

dwFileOffsetHighおよびdwFileOffsetLowは、1つの64ビット値を形成するために結合された2つの32ビット値です。この関数は、64ビット値のコンパイラサポートが広く普及しているため、このように実装されました。

あなたの誤解は、上限と下限の上限と下限が高いと低いと信じていると思います。あなたの値は、あなたの場合は

はどこにもあなたがdwFileOffsetHighためdwFileOffsetLow0ためfileSize+1を渡す必要がありますので、64ビットを必要とするの近くにある(fileSizeが1キロバイトの周りにあると仮定した場合)。

しかし、ファイル全体をマップしようとしている場合は、両方のパラメータに対して単に0を渡すことができます。 documentationから

dwMaximumSizeHigh [IN]

ファイルマッピングオブジェクトの最大サイズの上位DWORD。

dwMaximumSizeLow [IN]

ファイルマッピングオブジェクトの最大サイズの下位DWORD。

このパラメータとdwMaximumSizeHighが0(ゼロ)の場合、ファイルマッピングオブジェクトの最大サイズは で、hFileが識別するファイル の現在のサイズと同じです。

長さが0のファイルをマップしようとすると、エラー のERROR_FILE_INVALIDというコードで失敗します。アプリケーションは、 の長さが0(ゼロ)のファイルをテストし、それらのファイルを拒否する必要があります。

+0

ありがとう、私はそれがそれらの行に沿って何かだと思った。私はそれを読んだが、何とかそれを理解できなかった。私のためにそれを明確にしてくれてありがとう! –

0

非常に大きなファイルマッピングを作成しようとしています。 dwFileOffsetHightおよびdwFileOffsetLowは、64ビット積分の上位および下位32ビットコンポーネントです。代わりにGetFileSizeExを使用して、ファイルサイズの両方のコンポーネントを取得します。