首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

映射文件 共享内存解决方法

2012-01-18 
映射文件 共享内存我写了一个类,.h文件如下:classCShareMemoryCShareMemory*CreateMemory(constchar*pszM

映射文件 共享内存
我写了一个类,.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;
}

这样是可以了的,为什么将上面的//去掉就不行了,难道一个进程中只能操作一个映射文件么?
各位高手给讲解一下吧,先多谢各位了!


[解决办法]
是不是CreateMemory函数有问题?
[解决办法]
当然可以使用多个映射文件,你的问题是静态变量造成的,进程间共享内存要使用共享段。

热点排行