注意:如果多个进程共享单个文件映射对象,那么所有进程必须使用相同的名字来表示该文件映射对象。
//------------------------------------------------------------
// 文件名 :
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;
}