Win10x64系统VS2022使用CreateFileMapping返回无效句柄

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 位系统中编译时使用正确的类型转换。

修改后应该就能成功创建文件映射对象了。
相关推荐
冷崖2 小时前
排序--基数排序
c++·算法
淼淼7632 小时前
Qt调度 程序
开发语言·c++·windows·qt
暗然而日章3 小时前
C++基础:Stanford CS106L学习笔记 13 特殊成员函数(SMFs)
c++·笔记·学习
云泽8083 小时前
STL容器性能探秘:stack、queue、deque的实现与CPU缓存命中率优化
java·c++·缓存
J ..3 小时前
C++ Lambda 表达式完全指南
c++
Qt程序员4 小时前
从 C++11 到 C++23:枚举的原理升级与实践
c++·c++23
CC.GG4 小时前
【C++】红黑树
java·开发语言·c++
闻缺陷则喜何志丹4 小时前
【计算几何 线性代数】仿射矩阵的秩及行列式
c++·线性代数·数学·矩阵·计算几何·行列式·仿射矩阵得秩
xu_yule4 小时前
算法基础-背包问题(01背包问题)
数据结构·c++·算法·01背包