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; }
测试流程
- 先启动修正后的父进程,它会等待你按键再解除映射
- 启动子进程,此时可以正常读取父进程写入的数据
- 回到父进程按任意键,父进程正常退出
这样就能彻底解决你遇到的访问违例问题,同时保证进程间通信的正确性。
内容的提问来源于stack exchange,提问作者Prabakar
相关产品推荐
相关产品推荐

