进程间的数据共享
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函数时的尾参数都是一致的,因此获取的内存文件句柄都是指向同一个,最后根据该句柄获取的内存存储地址才是一致,故达到了不同进程间共享数据的目的。
//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函数时的尾参数都是一致的,因此获取的内存文件句柄都是指向同一个,最后根据该句柄获取的内存存储地址才是一致,故达到了不同进程间共享数据的目的。
相关文章推荐
- python 进程间共享数据 (三)
- Linux 进程间数据共享 的三种方法
- linux 共享内存shm_open实现进程间大数据交互
- VC共享内存实现进程间数据的交换
- 同一进程下线程共享的数据和独有的数据
- 共享内存实现进程间大数据的交换
- DLL入门浅析(5)——使用DLL在进程间共享数据
- 猎豹MFC--内存映射_两个进程间共享数据
- 转发:Python通过Manager方式实现多个无关联进程共享数据
- 转载资料-使用 WM_COPYDATA 在进程间共享数据(见关联的文章)
- 使用DLL在进程间共享数据
- 用FileMapping跨进程共享数据
- Python多进程数据共享之Array
- Android中SharedPreference多进程数据共享出错
- DLL入门浅析(5)——使用DLL在进程间共享数据
- DLL入门浅析——使用DLL在进程间共享数据
- DLL入门浅析(5)——使用DLL在进程间共享数据
- 内存映射文件--进程间数据共享
- 使用DLL在进程间共享数据(5)
- 利用内存映射文件在两个进程间共享数据 转