Win10x64系统VS2022使用CreateFileMapping创建共享内存返回空值,使用GetLastError()查看错误码为6
cpp
GetLastError() 返回 6 表示 ERROR_INVALID_HANDLE(无效句柄)。问题出在 0xffffffff 这个值上。
问题分析
cpp
在较新版本的 Windows SDK 中,CreateFileMapping 的
第一个参数需要使用特殊值 INVALID_HANDLE_VALUE(定义为 (HANDLE)-1),
而不是直接使用 0xffffffff。
直接使用 0xffffffff 在某些情况下会被视为无效句柄,
尤其是在 64 位系统上。
解决方案
cpp
方案1:使用正确的常量
cpp
// 正确的方式
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 使用标准常量
NULL,
PAGE_READWRITE,
0,
1024,
L"test"); // 注意:如果是Unicode项目,需要L前缀
方案2:如果使用 ANSI 版本
HANDLE hMapFile = CreateFileMappingA(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
1024,
"test");
完整示例代码
cpp
cpp
#include <windows.h>
#include <iostream>
int main() {
// 创建文件映射对象
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 正确的无效句柄值
NULL,
PAGE_READWRITE,
0,
1024,
L"MySharedMemory"); // 命名共享内存
if (hMapFile == NULL) {
DWORD dwError = GetLastError();
std::cout << "CreateFileMapping failed. Error: " << dwError << std::endl;
return 1;
}
std::cout << "File mapping created successfully!" << std::endl;
// 映射到进程地址空间
LPVOID pBuffer = MapViewOfFile(
hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
1024);
if (pBuffer == NULL) {
std::cout << "MapViewOfFile failed. Error: " << GetLastError() << std::endl;
CloseHandle(hMapFile);
return 1;
}
// 使用共享内存...
// ...
// 清理
UnmapViewOfFile(pBuffer);
CloseHandle(hMapFile);
return 0;
}
其他注意事项
cpp
1.命名共享内存:如果要在不同进程间共享,确保名称唯一且不冲突。
2.安全性:考虑是否需要设置安全属性(第二个参数)。
3.Unicode/ANSI:根据项目设置使用正确的字符串格式:
Unicode项目:L"name"
ANSI项目:"name" 或使用 CreateFileMappingA
4.检查返回值和错误:你现在的做法(检查返回值和调用 GetLastError())是正确的,继续保持这个好习惯。
5.64位兼容性:确保在 64 位系统中编译时使用正确的类型转换。
修改后应该就能成功创建文件映射对象了。