HIWORD
和LOWORD
宏旨在从 32 位中提取高 16 位字和低 16 位字DWORD
。CreateFileMapping
另一方面,期望两个DWORD
s 一起组成一个 64 位无符号整数,即映射对象的大小。
HIWORD(UBS_MEM_SIZE)
和LOWORD(UBS_MEM_SIZE)
yield (两个0xffff
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"));
如果您确实需要处理 size over 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 位的类型(即使它的值可能小于该值),因为否则在 C++ 中移位 32 位是未定义的行为。所以,如果你想使用上面的第二个变体和你的初始值,它必须是这样的
#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);
}
这样,您无需记住有关位、移位和整数类型大小的任何棘手细节。