利用内存映射文件在进程间共享数据

闲暇时间随便写了个小例子,代码很简单,有注释

代码如下:

//利用内存文件映射,在2个进程中共享数据
//首先一个进程1创建 内存映射文件,并且输入想要通信的数据
//然后,另一个进程2Create的时候,会检测该映射文件是否存在,如果存在则映射文件,并且读取数据
#include <windows.h>
#include <iostream>
#include <string>

int main()
{
  //由于是为了在进程间共享数据,因此CreateFileMapping 的第一个参数
  //为 INVALID_HANDLE_VALUE,那么系统会在页交换文件中创建映射对象,
  //而不是在磁盘上,这样会提升效率的
  HANDLE hFilemap = ::CreateFileMapping(INVALID_HANDLE_VALUE,
                                        NULL,
                                        PAGE_READWRITE,
                                        0,
                                        4 * 1024,
                                        L"ShareData");
  if(NULL != hFilemap)
  {
    if(ERROR_ALREADY_EXISTS == GetLastError())
    {
      //同名的filemap已经存在,准备获得数据
      std::cout << "Mapping already exists" << std::endl;
      CloseHandle(hFilemap);
      
      hFilemap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,
                                 FALSE,
                                 L"ShareData");

      PVOID pView = MapViewOfFile(hFilemap,
                                  FILE_MAP_READ | FILE_MAP_WRITE,
                                  0,
                                  0,
                                  0);
      if(pView != NULL)
      {
        std::wstring strShareData;
        strShareData = (PTSTR)pView;
        
        std::wcout << L"share data:" << strShareData << std::endl;
      }
    }
    else
    {
      //否则,则映射文件,并且写入数据
      PVOID pView = MapViewOfFile(hFilemap,
                                  FILE_MAP_READ | FILE_MAP_WRITE,
                                  0,
                                  0,
                                  0);

      if(NULL != pView)
      {
        std::cout << "please input share date" << std::endl;
        std::wstring wstrShareData;
        std::wcin >> wstrShareData;

        wcscpy((PWSTR)pView, wstrShareData.c_str());
      }

      UnmapViewOfFile(pView);
    }
  }
  else
  {
    std::cout << "create file map failed" << std::endl;
  }

  system("pause");
  return 0;
}


你可能感兴趣的:(利用内存映射文件在进程间共享数据)