程序A中共享数据, 代码:
// 内存共享数据A.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "内存共享数据A.h" #include<vector> using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp theApp; #define MEM_SIZE 0x1000000 #define MEM_SHARE_NAME TEXT("demo") int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { //创建或获取内存文件句柄 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); //设置数据 vector<int> a; for (int i=0; i<10; i++) a.push_back(i+1); memcpy(pMem, &a[0], a.size()*sizeof(int)); } while (1) { Sleep(1000); } //如果不再使用,应该关闭句柄 //CloseHandle(hFile); return 0; }
程序B中使用数据, 代码:
// 内存共享数据A.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "共享内存数据B.h" #include<vector> using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp theApp; #define MEM_SIZE 0x1000000 #define MEM_SHARE_NAME TEXT("demo") int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { //创建或获取内存文件句柄 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); //读取数据 vector<int> a(10); memcpy(&a[0],pMem,a.size()*sizeof(int)); for (int i=0; i<10; i++) cout<<a[i]<<endl; } //如果不再使用,应该关闭句柄 //CloseHandle(hFile); return 0; }
函数说明:
HANDLE CreateFileMapping(HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName);
参数hFile指定了待映射到进程地址空间的文件句柄,如果为无效句柄INVALID_HANDLE_VALUE则系统会创建一个使用来自页文件而非指定磁盘文件存储器的文件映射对象;
flProtect设定了系统对页面采取的保护属性,由于需要进行读写操作,因此可以设置保护属性PAGE_READWRITE;
dwMaximumSizeHigh和dwMaximumSizeLow指定了所开辟共享内存区的最大字节数;
lpName用来给此共享内存设定一个名字,接收程序可以通过这个名字将其打开。
LPVOID MapViewOfFile(HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap);
参数hFileMappingObject为CreateFileMapping()返回的内存文件映像对象句柄;
参数dwDesiredAccess再次指定对其数据的访问方式,而且需要同CreateFileMapping()函数所设置的保护属性相匹配。
也可以写简单一些:
A程序代码:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { //创建内存文件句柄 HANDLE hFile = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, 0x1000000, "mySharedMem"); //获取存储的内存地址 VOID * pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0); int* p = (int*)pMem; p[0] = 1; p[1] = 2; while (1) { Sleep(1000); } //如果不再使用,应该关闭句柄 CloseHandle(hFile); return 0; }
B程序代码:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { //获取内存文件句柄 HANDLE hFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "mySharedMem"); VOID * pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0); int* p = (int*)pMem; cout<<p[0]<<endl <<p[1]<<endl; return 0; }
OpenFileMapping中第一个参数是权限, FILE_MAP_ALL_ACCESS与FILE_MAP_WRITE相同; 第二个参数如果为TRUE,可以继承进程句柄,一半设为FALSE; 第三个参数是打开的mapping对象的名字.