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

修改后应该就能成功创建文件映射对象了。
相关推荐
微露清风1 天前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
CSARImage1 天前
C++读取exe程序标准输出
c++
一只小bit1 天前
Qt 常用控件详解:按钮类 / 显示类 / 输入类属性、信号与实战示例
前端·c++·qt·gui
一条大祥脚1 天前
26.1.9 轮廓线dp 状压最短路 构造
数据结构·c++·算法
项目題供诗1 天前
C语言基础(一)
c++
@areok@1 天前
C++opencv图片(mat)传入C#bitmap图片
开发语言·c++·opencv
鸽芷咕1 天前
【2025年度总结】时光知味,三载同行:落笔皆是沉淀,前行自有光芒
linux·c++·人工智能·2025年度总结
羑悻的小杀马特1 天前
指尖敲代码,笔尖写成长:2025年度总结与那些没说出口的碎碎念
linux·c++·博客之星·2025年度总结
linweidong1 天前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
cpp_25011 天前
P2708 硬币翻转
数据结构·c++·算法·题解·洛谷