//========================================================================
//TITLE:
// 进程间的数据共享
//AUTHOR:
// norains
//DATE:
// Friday 20-June-2008
//Environment:
// WINCE5.0 + VS2005 + MIPS SDK
//========================================================================
同一进程的不同线程间共享数据不是难事,并且方式也很多,不胜枚举;而不同的进程间需要共享数据,虽然方法不多,但却也颇有成效。
其实不同进程间的数据共享很简单,只需要调用CreateFileMapping和MapViewOfFile即可。CreateFileMapping创建或获取一个内存文件句柄,而MapViewOfFile则是获取文件句柄的存储内存的起始地址。
假设有两个程序,程序A负责设置数据,程序B负责读取,则简单的程序例子可以如下:
程序A:
#include "windows.h"
#include "vector"
#define MEM_SIZE 0x1000000
#define MEM_SHARE_NAME TEXT("bobo")
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
//创建或获取内存文件句柄
HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
VOID * pMem = NULL;
if(hFile != NULL)
{
//获取存储的内存地址
pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);
//设置数据
std::vector<char> vtStr;
vtStr.push_back('T');
vtStr.push_back('E');
vtStr.push_back('S');
vtStr.push_back('T');
vtStr.push_back(0);
memcpy(pMem,&vtStr[0],vtStr.size());
}
//如果不再使用,应该关闭句柄
//CloseHandle(hFile);
return 0;
}
程序B:
#include "windows.h"
#include "vector"
#define MEM_SIZE 0x1000000
#define MEM_SHARE_NAME TEXT("bobo")
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
VOID * pMem = NULL;
if(hFile != NULL)
{
pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);
//读取数据
std::vector<char> vtStr(6,0);
memcpy(&vtStr[0],pMem,vtStr.size());
}
//如果不再使用,应该关闭句柄
//CloseHandle(hFile);
return 0;
}
这两个程序片段很简单,为了说明方便,并没有用到信号量同步。两个程序间之所以能够读取相同的内存地址,主要是调用CreateFileMapping函数时的尾参数都是一致的,因此获取的内存文件句柄都是指向同一个,最后根据该句柄获取的内存存储地址才是一致,故达到了不同进程间共享数据的目的。