本文内容摘抄自论坛的相关帖子内容:
内存映射机制的效率是很高的,好像Windows下所有的进程间通信机制都是基于内存映射完成的
1、在windows下共享内容可以参考《windows核心编程》
书中有详细的解答
大体方法如下:
1,创建一个页文件存储区CreateFile(这里的有个参数要注意,要设置为共享才可以)
2,创建文件映射CreateFileMapping
3,获取共享内存地址MapViewOfFile
不用的时候释放地址就可以了.
2、
dll 里用 new 或 alloc、malloc 申请的内存是不能共享的,
要共享动态内存,必须用 GlobalAlloc 来申请。使用的时候用 GlobalLock 来锁定。用完后 GlobalFree 来释放。
3、可以用内存映射文件实现动态内存共享,应该说的就是第一点吧。
4、如果在wince下,可以写成驱动的形式,提供接口:创建、读、写等。
5、关于共享内存编程的一段代码,用C++类封装
/////////////////////////////////////////////////////////////////////// // Author :bzere.lee // Description :a class for share memroy in different process; // version : V2.0 // Time :2007/06/29 // Modify : // Contact Auhtor:[email protected] ///////////////////////////////////////////////////////////////////// #pragma once class CMMF { public: //--CreateMMF CMMF(); CMMF(LPCTSTR szMMFName,LPCTSTR szMutexName,DWORD dwMMFSize); ~CMMF(); public: BOOL Create(LPCTSTR szMMFName,LPCTSTR szMutexName,DWORD dwMMFSize); BOOL Read(TCHAR* szOut);//--Read MMF contents BOOL Write(LPCTSTR szIn);//--Write MMF contents void Empty(){Write(_T("\0"));} private: BOOL _Init(LPCTSTR szMMFName,LPCTSTR szMutexName,DWORD dwMMFSize); BOOL _Exit(); HANDLE m_hMutex;//--mutex used to synchronize access to m_pViewOfFile //--memory mapping file common for all instances: HANDLE m_hFileMapping;//-- memory mapped file LPVOID m_pViewOfFile;//-- view of file, contains text in edit box }; ==============================NB的分割线======================================= #include "stdafx.h" #include"MMF.h" #define MAXWAITTIMEOUT 500 CMMF::CMMF() { m_hMutex =NULL; m_hFileMapping = NULL; m_pViewOfFile = NULL; } CMMF::CMMF(LPCTSTR szMMFName,LPCTSTR szMutexName,DWORD dwMMFSize) { _Init(szMMFName,szMutexName,dwMMFSize); } CMMF::~CMMF() { try { _Exit(); } catch(...) { } } BOOL CMMF::Create(LPCTSTR szMMFName,LPCTSTR szMutexName,DWORD dwMMFSize) { return _Init(szMMFName,szMutexName,dwMMFSize); } BOOL CMMF::_Init(LPCTSTR szMMFName,LPCTSTR szMutexName,DWORD dwMMFSize) { BOOL bRet = TRUE; m_hMutex =NULL; m_hFileMapping = NULL; m_pViewOfFile = NULL; // Create file mapping which can contain dwMemoryFileSize characters m_hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE, // system paging file NULL, // security attributes PAGE_READWRITE, // protection 0, // high-order DWORD of size dwMMFSize*sizeof(TCHAR), // low-order DWORD of size szMMFName); // name DWORD dwError = GetLastError(); // if ERROR_ALREADY_EXISTS if (!m_hFileMapping) { //throw MusicException(_T("")); } else { m_pViewOfFile = MapViewOfFile(m_hFileMapping, FILE_MAP_ALL_ACCESS,0, 0,0); if (!m_pViewOfFile) { throw MusicExcption(_T("MMF MapViewOfFile Failed.")); } } //Create Mutex For MutilProcess m_hMutex = ::CreateMutex( NULL, FALSE,szMutexName); if (!m_hMutex) { throw MusicExcption(_T("MMF Can't Create Mutex.")); } return bRet; } BOOL CMMF::_Exit() { BOOL bRet = TRUE; if (m_hFileMapping) { if (m_pViewOfFile) { UnmapViewOfFile(m_pViewOfFile); } CloseHandle(m_hFileMapping); } if (m_hMutex) { ::CloseHandle(m_hMutex); } return bRet; } BOOL CMMF::Read(TCHAR* szOut) { BOOL bRet = TRUE; if (m_pViewOfFile && m_hMutex) { if(WAIT_OBJECT_0 == ::WaitForSingleObject(m_hMutex, MAXWAITTIMEOUT)) { lstrcpy(szOut,(LPCTSTR)m_pViewOfFile); if(!::ReleaseMutex(m_hMutex)) { throw MusicExcption(_T("MMF Release Mutex Failed.")); } } } else { bRet = FALSE; } return bRet; } BOOL CMMF::Write(LPCTSTR szIn) { BOOL bRet = TRUE; if (WAIT_OBJECT_0 == WaitForSingleObject(m_hMutex, MAXWAITTIMEOUT)) { lstrcpy((LPTSTR)m_pViewOfFile,szIn); if(!::ReleaseMutex(m_hMutex)) { throw MusicExcption(_T("MMF Release Mutex Failed.")); } } else { bRet = FALSE; } return bRet; }