1

CreateFileMapping エラー コード 8.このコマンドを処理するのに十分なストレージがありません。64 ビットの Win10 Visual C++ で 4 Gb (0xFFFFFFFF) のファイル マッピングを作成しようとしています。

#define UBS_MEM_SIZE 0xffffffff

HANDLE hMapObject = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr,           
PAGE_READWRITE, HIWORD(UBS_MEM_SIZE), LOWORD(UBS_MEM_SIZE),     
TEXT("dllmemfilemap"));

この「エラー 8」の問題を解決するにはどうすればよいですか?

4

2 に答える 2

4

およびマクロは、32 ビット から上位および下位の 16 ビット ワードを抽出することを目的としていHIWORDます。一方、 は、マッピング オブジェクトのサイズである 64 ビットの符号なし整数を一緒に構成する 2 つの を期待します。LOWORDDWORDCreateFileMappingDWORD

両方ともHIWORD(UBS_MEM_SIZE)生成LOWORD(UBS_MEM_SIZE)0xffffれ (2 つの 16 ビットの半分)、これらは 32 ビットの符号なし整数に変換されます (関数が期待するもの)。

したがって、実際に行っているのは、 size のファイル マッピングを要求することです0x0000ffff0000ffff。これは以上です255 TB。を使用しINVALID_HANDLE_VALUEているため、これは RAM またはシステム ページ ファイルによってバックアップする必要があります。そんなに利用できるとは思えません。

UBS_MEM_SIZE常に 32 ビットの場合は、単純に使用できます

HANDLE hMapObject = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr,
   PAGE_READWRITE, 0, UBS_MEM_SIZE,
   TEXT("dllmemfilemap"));

を超えるサイズを実際に処理する必要がある場合は4 GB、次のようにすることができます。

HANDLE hMapObject = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 
   static_cast<DWORD>(UBS_MEM_SIZE >> 32), static_cast<DWORD>(UBS_MEM_SIZE), 
   TEXT("dllmemfilemap"));

UBS_MEM_SIZE実際に 32 ビットより大きい型を持っていることを確認してください(その値がそれよりも小さい場合でも)。それ以外の場合、32 ビットでシフトすることは C++ では未定義の動作です。したがって、上記の 2 番目のバリアントを初期値で使用する場合は、次のようにする必要があります。

#define UBS_MEM_SIZE 0xFFFFFFFFull

(ちなみに、使用const...)

より安全にするために、呼び出しを次のようにラップします。

inline HANDLE MyCreateMapping(unsigned long long size, LPCTSTR name)
{
   return CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE,
      static_cast<DWORD>(size >> 32), static_cast<DWORD>(size), name);
}

このように、ビット、シフト、および整数型のサイズに関する複雑な詳細を覚えておく必要はありません。

于 2015-09-21T12:58:00.060 に答える