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

修改后应该就能成功创建文件映射对象了。
相关推荐
dtq04247 小时前
C++小案例 - 日志实战
开发语言·c++
码匠许师傅7 小时前
【C++三方组件】Qt 概览:桌面 C++ 的事实标准与许可证三轨
开发语言·c++·qt
码匠许师傅8 小时前
【C++三方组件】POCO:跨平台系统编程全家桶
开发语言·c++
WBluuue11 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
必须得开心呀12 小时前
字节序大小端科普
c++·程序人生
会编程的小孩13 小时前
C++ 子集
c++
SunkingYang13 小时前
C++20 vs C++17:新特性对比与用法指南
c++·c++20·特性·版本·新特性·对比·c++17
前进吧-程序员13 小时前
C++20 协程入门实战:从 co_await 到一个 100 行的异步任务调度器
网络·c++·c++20
前进吧-程序员14 小时前
实战:C++20 协程 + io_uring 写一个 400 行的 echo server
网络·c++·c++20
青少儿编程课堂18 小时前
蓝桥杯青少组 + 全国青少年信息素养大赛 + 电子学会图形化考级|校园推箱子大挑战解析
c++·python·算法·bfs·信息学竞赛