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

修改后应该就能成功创建文件映射对象了。
相关推荐
rainbow688916 小时前
VSCode配置C/C++环境全攻略
c++
naruto_lnq16 小时前
C++中的桥接模式
开发语言·c++·算法
j4455661116 小时前
C++中的职责链模式高级应用
开发语言·c++·算法
WarmSword17 小时前
mac上用cursor/vscode调试root权限进程
c++·ide·vscode·macos·mac
m0_7369191017 小时前
模板元编程性能分析
开发语言·c++·算法
wbs_scy17 小时前
C++11:类新功能、lambda与包装器实战
开发语言·c++
永远睡不够的入17 小时前
类和对象(中)
c++
飞鹰5117 小时前
深度学习算子CUDA优化实战:从GEMM到Transformer—Week4学习总结
c++·人工智能·深度学习·学习·transformer
2301_7657031417 小时前
C++中的职责链模式实战
开发语言·c++·算法
StandbyTime17 小时前
《算法笔记》学习记录-第一章
c++·算法·算法笔记