注意:如果多个进程共享单个文件映射对象,那么所有进程必须使用相同的名字来表示该文件映射对象。
//------------------------------------------------------------
// 文件名    :
 17_FileMapping_SharaData.cpp
// 创建者    :  方煜宽
//  邮箱      : fangyukuan@gmail.com
// 创建时间   :  2010-9-6 16:15
// 功能描述   :  使用内存映射文件在进程之间共享数据
//              请运行多个进程以观察进程之间共享数据的效果
//
------------------------------------------------------------
#include "stdafx.h"
#include "windows.h"
#include "process.h"
#include <iostream>
using namespace std;
HANDLE g_hTimer = NULL;
DWORD WINAPI Thead(void* pParam)
{
   HANDLE hFileMapping
= (HANDLE)pParam;
   int nIndex = 0;
   while (true)
   {
      ::WaitForSingleObject(g_hTimer,
INFINITE);
      void* pbFile = (void*)::MapViewOfFile(hFileMapping, FILE_MAP_WRITE,
0, 0, 0);
      cout << nIndex++
<< " :"<<
(PBYTE)pbFile
<< endl;
      ::UnmapViewOfFile(pbFile);
   }
   return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
   HANDLE hFileMapping
= ::CreateFileMapping(INVALID_HANDLE_VALUE, 
      NULL,
      PAGE_READWRITE,
      0,
99,
      TEXT("kuan_FileMap"));
   void* pbFile = (void*)::MapViewOfFile(hFileMapping, FILE_MAP_WRITE,
0, 0, 0);
   char szTemp[999] =
{0};
   cout << "input
data:";
   cin >> szTemp;
   memcpy(pbFile, szTemp, strlen(szTemp));
   ::FlushViewOfFile(pbFile,
999);
   // 下面是创建一个等待定时器
   DWORD dwTheadID;
   HANDLE hThead =
::CreateThread(NULL,
0, Thead, hFileMapping,
0, &dwTheadID);
   g_hTimer = ::CreateWaitableTimer(NULL, FALSE, NULL);
   LARGE_INTEGER li;
   li.QuadPart =
0;
   ::SetWaitableTimer(g_hTimer,
&li, 1000, NULL,
NULL, FALSE);
   ::WaitForSingleObject(hThead,
INFINITE);
   ::UnmapViewOfFile(pbFile);
   ::CloseHandle(hFileMapping);
   ::CloseHandle(hThead);
   ::CloseHandle(g_hTimer);
   return 0;
}

 
                    
                 

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号