szgzwf

http://www.etsec.com.cn

导航

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

闲暇时间随便写了个利用内存映射文件在进程间共享数据小例子,代码很简单,有注释

代码如下:

 

[cpp]
  1. //利用内存文件映射,在2个进程中共享数据  
  2. //首先一个进程1创建 内存映射文件,并且输入想要通信的数据  
  3. //然后,另一个进程2Create的时候,会检测该映射文件是否存在,如果存在则映射文件,并且读取数据  
  4. #include <windows.h>  
  5. #include <iostream>  
  6. #include <string>  
  7.   
  8. int main()  
  9. {  
  10.   //由于是为了在进程间共享数据,因此CreateFileMapping 的第一个参数  
  11.   //为 INVALID_HANDLE_VALUE,那么系统会在页交换文件中创建映射对象,  
  12.   //而不是在磁盘上,这样会提升效率的  
  13.   HANDLE hFilemap = ::CreateFileMapping(INVALID_HANDLE_VALUE,  
  14.                                         NULL,  
  15.                                         PAGE_READWRITE,  
  16.                                         0,  
  17.                                         4 * 1024,  
  18.                                         L"ShareData");  
  19.   if(NULL != hFilemap)  
  20.   {  
  21.     if(ERROR_ALREADY_EXISTS == GetLastError())  
  22.     {  
  23.       //同名的filemap已经存在,准备获得数据  
  24.       std::cout << "Mapping already exists" << std::endl;  
  25.       CloseHandle(hFilemap);  
  26.         
  27.       hFilemap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,  
  28.                                  FALSE,  
  29.                                  L"ShareData");  
  30.   
  31.       PVOID pView = MapViewOfFile(hFilemap,  
  32.                                   FILE_MAP_READ | FILE_MAP_WRITE,  
  33.                                   0,  
  34.                                   0,  
  35.                                   0);  
  36.       if(pView != NULL)  
  37.       {  
  38.         std::wstring strShareData;  
  39.         strShareData = (PTSTR)pView;  
  40.           
  41.         std::wcout << L"share data:" << strShareData << std::endl;  
  42.       }  
  43.     }  
  44.     else  
  45.     {  
  46.       //否则,则映射文件,并且写入数据  
  47.       PVOID pView = MapViewOfFile(hFilemap,  
  48.                                   FILE_MAP_READ | FILE_MAP_WRITE,  
  49.                                   0,  
  50.                                   0,  
  51.                                   0);  
  52.   
  53.       if(NULL != pView)  
  54.       {  
  55.         std::cout << "please input share date" << std::endl;  
  56.         std::wstring wstrShareData;  
  57.         std::wcin >> wstrShareData;  
  58.   
  59.         wcscpy((PWSTR)pView, wstrShareData.c_str());  
  60.       }  
  61.   
  62.       UnmapViewOfFile(pView);  
  63.     }  
  64.   }  
  65.   else  
  66.   {  
  67.     std::cout << "create file map failed" << std::endl;  
  68.   }  
  69.   
  70.   system("pause");  
  71.   return 0;  
  72. }  

posted on 2012-11-06 17:24  szgzwf  阅读(171)  评论(0)    收藏  举报