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

修改后应该就能成功创建文件映射对象了。
相关推荐
2601_956121976 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-8 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
小星星闪亮登场10 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑10 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶10 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ11 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
别动我齐刘海12 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
Henry Zhu12313 小时前
C++17 `weak_from_this` 详解:让对象安全地观察自己
c++
June`16 小时前
warp shuffle指令
c++·人工智能·算法·cuda
乱七八糟的屋子16 小时前
【C++数值计算】NumCpp超详细入门教程(纯正Numpy语法、零学习成本、C++首选科学计算库、性能压测对比)
c++·数值计算·numpy·高性能计算·科学计算·ndarray