您的位置:首页 > 其它

进程间的数据共享

2008-07-16 23:19 218 查看
//========================================================================
//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函数时的尾参数都是一致的,因此获取的内存文件句柄都是指向同一个,最后根据该句柄获取的内存存储地址才是一致,故达到了不同进程间共享数据的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: