动态内存共享

本文内容摘抄自论坛的相关帖子内容:

内存映射机制的效率是很高的,好像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;
 }
 


 

 

你可能感兴趣的:(动态内存共享)