およびマクロは、32 ビット から上位および下位の 16 ビット ワードを抽出することを目的としていHIWORD
ます。一方、 は、マッピング オブジェクトのサイズである 64 ビットの符号なし整数を一緒に構成する 2 つの を期待します。LOWORD
DWORD
CreateFileMapping
DWORD
両方とも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);
}
このように、ビット、シフト、および整数型のサイズに関する複雑な詳細を覚えておく必要はありません。