本文内容摘抄自论坛的相关帖子内容:
内存映射机制的效率是很高的,好像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:navyblue1982@hotmail.com
/
#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;
}