windows中的IPC共享内存std::vector

IPC shared memory std::vector in windows

本文关键字:std vector 内存 共享 中的 IPC windows      更新时间:2023-10-16

我有两个win32程序,它们通过IPC与一个DLL通信。我使用msvc++,所以我使用CreateFileMapping和MapViewOfFile是有意义的。我已经完成了一些代码,问题是,当我的第二个程序启动并加载DLL并开始使用DLL时,一切都很好,IPC通信进展顺利。当第一个程序启动并加载DLL并开始使用DLL时,第二个程序启动并加载DLL并开始使用DLL时,第二个程序停止通过IPC与DLL通信。IPC通信可能正在运行,但可能以错误的方式运行。它获得了大小和容量,但内容是垃圾。共享内存的内容是指针的向量!我做错了什么?我需要知道什么才能让它们正常工作吗?

//The sender writer
MainWindow::~MainWindow()
{
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
}
void MainWindow::SetData(vector <SubWindow*> &iMainWin)
{
    hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(vector <SubWindow*>), TEXT("MyMappedMem"));
    if (hMapFile == NULL)
        return;
    vector <SubWindow*> *pBuf = reinterpret_cast<std::vector<SubWindow*>*> (MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(vector <SubWindow*>)));
    if (pBuf == NULL)
    {
        CloseHandle(hMapFile);
        return;
    }
    memcpy(pBuf, &iMainWin, sizeof(iMainWin));
    return;
}
//The reciever reader 
void DataWork()
{
    do{
       if (strcmp(pe32.szExeFile, "Win32Project.exe") == 0)
       {
           bProcessFound = true;
           break;
       }
     } while (Process32Next(hProcessSnap, &pe32));
     if (!bProcessFound)
     {
         MessageBox(NULL, TEXT("ERROR Process32Next Openning DLL"), TEXT("ERROR"), MB_OK);
         return;
     }
     else
     {
        HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, TEXT("MyMappedMem"));
        if (hMapFile == NULL)
        {
            MessageBox(NULL, TEXT("ERROR OpenFileMapping DLL"), TEXT("ERROR"), MB_OK);
            return;
        }
        vector<SubWindow*> *pBuf = reinterpret_cast<std::vector<SubWindow*>*> (MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(vector <SubWindow*>)));
        if (pBuf == NULL)
        {
            MessageBox(NULL, TEXT("ERROR MapViewOfFile DLL"), TEXT("ERROR"), MB_OK);
            CloseHandle(hMapFile);
            return;
        }
        for (int i = 0; i < buf->size(); i++)
            (*buf)[i]->value_access;
        UnmapViewOfFile(pBuf);
        CloseHandle(hMapFile);
     }
}

第一个程序中的指针在第二个程序中是无用的,反之亦然。你不能在程序B中使用程序a的指针,因为它们有不同的虚拟内存空间。

尝试使用共享内存共享std::vector几乎肯定是错误的。std::vector将从调用进程分配内存,这些内存不能通过任何其他进程访问。此外,指向本地地址的指针将不能被任何其他进程访问。

此外,您需要使用互斥锁来协调对std::vector的访问,而您没有这样做。

在这种情况下,我不明白为什么使用文本文件是不够的。