You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VC++文件映射IPC程序调试触发0xC0000005访问违例求助

解决文件映射父进程的访问违例错误

你遇到的0xC0000005: Access violation writing location 0x0000000000000000错误,核心原因是父进程中文件映射对象创建失败,导致后续MapViewOfFile返回空指针,最终CopyMemory尝试写入空地址引发崩溃。我们一步步排查并修复:

错误点分析

1. CreateFileMapping的字符串语法错误

父进程代码中,文件映射的名称字符串少了闭合的双引号:

L"LOCAL\\MyFileMap);

这个语法错误会直接导致CreateFileMapping运行时返回NULL,后续流程基于无效句柄执行,必然出问题。

2. 错误的返回值判断逻辑

CreateFileMapping的返回值是HANDLE类型,失败时返回NULL而非FALSE。你原来的判断:

if (hFileMap == FALSE) { ... }

虽然FALSE本质是0,和空指针值一致,但从类型匹配和代码规范性角度,应该改为判断NULL,同时失败后要直接退出流程,避免后续代码继续执行。

3. 提前解除映射导致子进程读取失效

父进程写入数据后立刻调用UnmapViewOfFile,会释放映射的内存区域,子进程后续映射时可能无法读取到有效数据,需要等待子进程完成读取后再解除映射。

4. 遗漏的语法细节

父进程代码中using namespace std后面少了分号,这会导致编译警告,也可能影响后续代码的解析。

修正后的父进程代码

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <Tlhelp32.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <cstring>
#include <cctype>
#include <fstream>
using namespace std; // 补充分号

int main() {
    cout << "\t\t.....FILEMAPPING SERVER or PARENT....." << endl;
    cout << endl;
    //Local Variable Definitions
    HANDLE hFileMap;
    BOOL bResult;
    PCHAR lpBuffer = NULL;
    char Buffer[256] = "Hello From File Map Server";
    size_t szBuffer = sizeof(Buffer); // 用sizeof兼容更多环境

    // STEP 1 : Create File Map
    hFileMap = CreateFileMapping(
        INVALID_HANDLE_VALUE,
        NULL,
        PAGE_READWRITE,
        0,
        256,
        L"LOCAL\\MyFileMap"); // 修复引号问题
    if (hFileMap == NULL) { // 修正判断条件
        cout << "CreateFileMapping Failed & Error Number - " << GetLastError() << endl;
        return 1; // 失败后直接退出
    }
    else cout << "CreateFileMapping Success - " << endl;

    // STEP 2 : Map View of File
    lpBuffer = (PCHAR)MapViewOfFile(
        hFileMap,
        FILE_MAP_ALL_ACCESS,
        0,
        0,
        256);
    if (lpBuffer == NULL) {
        cout << "MapViewOf File Failed & Error No - " << GetLastError() << endl;
        CloseHandle(hFileMap); // 关闭已创建的句柄
        return 1;
    }
    else cout << "MapViewOf File Success " << endl;

    //STEP 3 : Copy Memory Function
    CopyMemory(lpBuffer, Buffer, szBuffer);
    cout << "Data written to file mapping successfully." << endl;

    // 等待子进程读取数据(用按键等待,实际项目可改用事件同步)
    cout << "Press any key to unmap and exit..." << endl;
    _getch();

    //STEP 4 : Unmap View Of File
    bResult = UnmapViewOfFile(lpBuffer);
    if (bResult == FALSE) {
        cout << "UnMapViewOfFile Failed & Error No - " << GetLastError() << endl;
    }
    else cout << "UnMapViewOfFile Success - " << endl;

    // 关闭文件映射句柄
    CloseHandle(hFileMap);

    system("PAUSE");
    return 0;
}

子进程代码优化建议

子进程代码整体逻辑没问题,建议在失败分支添加退出逻辑,避免无效执行:

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <Tlhelp32.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <cstring>
#include <cctype>
#include <fstream>
using namespace std;

int main() {
    cout << "\t\t.....FILEMAPPING CLIENT or CHILD....." << endl;
    cout << endl;
    // Local Variable Definitions
    HANDLE hFileMap;
    BOOL bResult;
    PCHAR lpBuffer = NULL;

    // STEP 1 : OpenFileMapping
    hFileMap = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,
        FALSE,
        L"LOCAL\\MyFileMap");
    if(hFileMap == NULL) {
        cout << "OpenFileMap Failed & error - " << GetLastError() << endl;
        return 1;
    }
    else cout << "OpenFileMap success " << endl;

    //STEP 2 : MapViewOfFile
    lpBuffer = (PCHAR)MapViewOfFile(
        hFileMap,
        FILE_MAP_ALL_ACCESS,
        0,
        0,
        256);
    if (lpBuffer == NULL) {
        cout << "MapViewOf File Failed & Error No - " << GetLastError() << endl;
        CloseHandle(hFileMap);
        return 1;
    }
    else cout << "MapViewOf File Success " << endl;

    //STEP 3 : Reading the data from File Map Object
    cout << "DATA READING FROM PARENT PROCESS--->" << lpBuffer << endl;

    //STEP 4 : UnMapViewOfFile
    bResult = UnmapViewOfFile(lpBuffer);
    if (bResult == FALSE) {
        cout << "UnMapViewOfFile Failed & Error No - " << GetLastError() << endl;
    }
    else cout << "UnMapViewOfFile Success - " << endl;

    //STEP 5 : Close Handle
    CloseHandle(hFileMap);

    system("PAUSE");
    return 0;
}

测试流程

  1. 先启动修正后的父进程,它会等待你按键再解除映射
  2. 启动子进程,此时可以正常读取父进程写入的数据
  3. 回到父进程按任意键,父进程正常退出

这样就能彻底解决你遇到的访问违例问题,同时保证进程间通信的正确性。

内容的提问来源于stack exchange,提问作者Prabakar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:36:42