我写了一个类,.h文件如下:
class CShareMemory;CShareMemory* CreateMemory(const char* pszMapName, DWORD dwSize, DWORD dwDesiredAccess);
CShareMemory* OpenMemory(const char* pszMapName, DWORD dwSize, DWORD dwDesiredAccess);
void DestroyMemory(const char* pszMapName);
class CShareMemory  
{
public:
CShareMemory(DWORD dwMemSize);
CShareMemory(DWORD dwMemSize, BYTE cmMode);
 ~CShareMemory();
public:
void* operator new(size_t nSize);
void  operator delete(void *pMem);
public:
//分配对象的内存块
void* AllotSegment(size_t nSize);
void AppData(const char* pszData, int nSize);
void* GetData();
public:
static BYTE* m_pShareData;                     //不搞成静态还不行的
private:
BYTE*       m_pCurSegment; //内部记录当前分配到什么地方了
DWORD       m_dwTotalSize;
BYTE        m_cmMode;
};
.cpp如下:
CShareMemory* CreateMemory(const char* pszMapName, DWORD dwSize, DWORD dwDesiredAccess)
{
BOOL bTest = FALSE;
HANDLE hMapFile = ::OpenFileMapping(dwDesiredAccess, FALSE, pszMapName);
if (NULL == hMapFile)
{
hMapFile = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0,  dwSize, pszMapName);
bTest = TRUE;
}
if (NULL == hMapFile)
return NULL;
{
if (bTest)
printf("Create Share Memory succeeded!\n");
else
printf("Open Share Memory succeeded!\n");
}
    CShareMemory::m_pShareData = (BYTE*)::MapViewOfFile(hMapFile, dwDesiredAccess, 0, 0, 0);
if (NULL == CShareMemory::m_pShareData)
{
::CloseHandle(hMapFile);
return NULL;
}
return new CShareMemory(dwSize + sizeof(CShareMemory));
}CShareMemory* OpenMemory(const char* pszMapName, DWORD dwSize, DWORD dwDesiredAccess)
{
HANDLE hMapFile = ::OpenFileMapping(dwDesiredAccess, FALSE, pszMapName);
if (NULL == hMapFile)
return NULL;
CShareMemory::m_pShareData = (BYTE*)::MapViewOfFile(hMapFile, dwDesiredAccess, 0, 0, 0);
if (NULL == CShareMemory::m_pShareData)
{
::CloseHandle(hMapFile);
return NULL;
}
printf("Share First Addr = 0x%08x\n", CShareMemory::m_pShareData);
return new CShareMemory(dwSize + sizeof(CShareMemory));
}//这个方法不行吧
void DestroyMemory(const char* pszMapName, DWORD dwDesiredAccess = FILE_MAP_WRITE|FILE_MAP_READ)
{
HANDLE hMapFile = ::OpenFileMapping(dwDesiredAccess, FALSE, pszMapName);
if (NULL == hMapFile)
return;
LPVOID pMapData = ::MapViewOfFile(hMapFile, dwDesiredAccess, 0, 0, 0);
if (NULL == pMapData)
{
::CloseHandle(hMapFile);
return;
}
::UnmapViewOfFile(pMapData);
pMapData = NULL;
CloseHandle(hMapFile);
}////////////////////////////////////////////////////////////////////////////BYTE* CShareMemory::m_pShareData = NULL;
//静态成员,一定要在new之前生成void* CShareMemory::operator new(size_t nSize)
{
if (NULL == m_pShareData)
return NULL;
BYTE* pTemp = m_pShareData;
return (void*)pTemp;
}void CShareMemory::operator delete(void* pMem)
{}//定位到当前的位置
CShareMemory::CShareMemory(DWORD dwMemSize)
{
m_pCurSegment = m_pShareData + sizeof(CShareMemory);
m_dwTotalSize = dwMemSize;
}CShareMemory::CShareMemory(DWORD dwMemSize, BYTE cmMode)
{
m_pCurSegment = m_pShareData + sizeof(CShareMemory);
m_dwTotalSize = dwMemSize;
m_cmMode = cmMode;
}CShareMemory::~CShareMemory()
{
}//为对象分配内存空间
void* CShareMemory::AllotSegment(size_t nSize)
{
if (nSize <= 0)
return NULL;
int nUsedLength = (int)(m_pCurSegment - (BYTE *)this);
if (m_dwTotalSize - nUsedLength < nSize)
return NULL;
BYTE* pTemp = m_pCurSegment; m_pCurSegment += nSize;

return (void*)pTemp;
}void CShareMemory::AppData(const char* pszData, int nSize)
{
memcpy(m_pShareData, pszData, nSize);
}void* CShareMemory::GetData()
{
return m_pShareData;
}在一个进程中如下:
CShareMemory* g_S2CBufMem  = NULL;CShareMemory* g_C2SBufMem  = NULL;void Reserver(BYTE* pData, unsigned short nLen);static int g_nCount = 0;int main(int argc, char* argv[])
{
g_C2SBufMem = CreateMemory("Test1",1000000, FILE_MAP_WRITE|FILE_MAP_READ);
//g_S2CBufMem= CreateMemory("Test2", 1000, FILE_MAP_WRITE|FILE_MAP_READ);
         memcpy(g_C2SBufMem->GetData(),"aaaaa", 5);
getchar();
return 0;
}另外一个进程如下:CShareMemory* g_S2CBufMem  = NULL;CShareMemory* g_C2SBufMem  = NULL;void Reserver(BYTE* pData, unsigned short nLen);static int g_nCount = 0;int main(int argc, char* argv[])
{
g_C2SBufMem = CreateMemory("Test1",1000000, FILE_MAP_WRITE|FILE_MAP_READ);
//g_S2CBufMem= CreateMemory("Test2", 1000, FILE_MAP_WRITE|FILE_MAP_READ);
         printf("%s\n",g_C2SBufMem->GetData90);
getchar();
return 0;
}这样是可以了的,为什么将上面的//去掉就不行了,难道一个进程中只能操作一个映射文件么?
各位高手给讲解一下吧,先多谢各位了!