进程间的数据共享

来源:互联网 发布:大学生贷款软件 编辑:程序博客网 时间:2024/04/28 17:36

//========================================================================
//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(&apos;T&apos;);
  vtStr.push_back(&apos;E&apos;);
  vtStr.push_back(&apos;S&apos;);
  vtStr.push_back(&apos;T&apos;);
  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函数时的尾参数都是一致的,因此获取的内存文件句柄都是指向同一个,最后根据该句柄获取的内存存储地址才是一致,故达到了不同进程间共享数据的目的。

原创粉丝点击