【问题标题】:Exception thrown at 0x00007FFF168E1657 (vcruntime140d.dll) in "<name>.exe": 0xC0000005: Access violation writing location 0x0000000000000000在“<name>.exe”中的 0x00007FFF168E1657 (vcruntime140d.dll) 处引发异常:0xC0000005:访问冲突写入位置 0x0000000000000000
【发布时间】:2018-06-26 09:32:47
【问题描述】:

我尝试为进程间通信 (IPC) 创建两个不同的可视化 c++ 控制台应用程序。这两个代码的构建都是成功的。但是,当我尝试调试它时,我得到了这样的异常“在 FileMapServer_Parent.exe 中的 0x00007FFF168E1657 (vcruntime140d.dll) 处引发的异常:0xC0000005:访问冲突写入位置 0x0000000000000000"

//PARENT PROCESS:

#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 = size(Buffer);


// STEP 1 : Create File Map

        hFileMap = CreateFileMapping(
            INVALID_HANDLE_VALUE,
            NULL,
            PAGE_READWRITE,
            0,
            256,
            L"LOCAL\\MyFileMap);


if (hFileMap == FALSE)
{
    cout << "CreateFileMapping Failed & Error Number - " << GetLastError() << endl;
}
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 Failes & Error No - " << GetLastError() << endl;
}
else
    cout << "MapViewOf File Success "  << endl;


//STEP 3 : Copy Memory Function

CopyMemory(lpBuffer,Buffer,szBuffer);


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

system("PAUSE");
return 0;
}

运行父进程时出现异常: [1]:https://i.stack.imgur.com/bomQB.png

//CHILD PREOCESS:

#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;
}
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 Failes & Error No - " << GetLastError() << endl;
    }
    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 FSuccess - " << endl;

//STEP 5 : Close Handle

    CloseHandle(hFileMap);

system("PAUSE");
return 0;
}

【问题讨论】:

  • 访问冲突写入位置 0x0000000000000000 看起来您正在取消引用空指针。
  • 现在是你learn how to debug your programs的时候了。使用调试器,您可以“实际”捕获崩溃,并查看它们在代码中发生的时间和地点。并检查变量及其值。
  • 按中断,搜索原因。
  • 如果文件映射失败,您应该退出。
  • 我不是视觉 C++ 方面的专家。我正在另一个平台上工作。我只是想使用共享内存来避免时间开销。我现在不知道该怎么办。

标签: c++ visual-studio ipc file-mapping


【解决方案1】:

问题出在这里:

hFileMap = CreateFileMapping(
    INVALID_HANDLE_VALUE,
    NULL,
    PAGE_READWRITE,
    0,
    256,
    L"LOCAL\\MyFileMap");

根据内核对象命名空间的文档,它们区分大小写,因此您必须将 LOCAL 更改为 Local 才能使其正常工作。

除了“Global\”前缀外,客户端进程还可以使用“Local\”前缀在其会话命名空间中显式创建对象。这些关键字区分大小写。

https://msdn.microsoft.com/en-us/library/aa382954(v=vs.85).aspx

在调试此问题时,我还更改了代码以在映射失败时退出:

if (hFileMap == NULL)
{
    cout << "CreateFileMapping Failed & Error Number - " << GetLastError() << endl;
    return -1;
}
else
    cout << "CreateFileMapping Success - " << endl;

这避免了原始“本地”的崩溃(映射失败)。

【讨论】:

    猜你喜欢
    • 2020-02-13
    • 2020-08-09
    • 2021-07-03
    • 2016-11-12
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多