解决方案 »

  1.   

    typedef struct ShareMenoryArray
    {
        CArray <UserInfo, UserInfo&> g_ClientArray;
     
    }*LPShareMenoryArray;这哪里是神马共享内存啊,这不就是自定义结构么。共享内存只能定义基本数据类型,如下:
    #pragma data_seg(".Shard")
    LONG g_lInstanceCount = 0;
    #pragma data_seg()
    #pragma comment(linker,"/section:.Shard,rws")
      

  2.   


    少年你不懂吧。。 你这也是个办法 但你那不好用是共享段果然年纪大了眼睛不好使了,那看下面这段好了
    #include "StdAfx.h"
    #include ".\sharememory.h"ShareMemory::ShareMemory(void)
    {
    m_hMap = NULL;
    m_pBuffer = NULL;
    }ShareMemory::~ShareMemory(void)
    {
    Close();
    }
    void ShareMemory::Close()
    { if( m_pBuffer )
    {
    UnmapViewOfFile(m_pBuffer); m_pBuffer = NULL;
    } if( m_hMap )
    {
    CloseHandle(m_hMap); m_hMap = NULL;
    }
    }string ShareMemory::ReadShareMemory(const WCHAR* pShareName)
    {
    string strRet = ""; do 
    {
    HANDLE m_hMap = OpenFileMapping(FILE_MAP_READ, FALSE, pShareName); if(!m_hMap)
    {
    LDB1(L"OpenFileMapping failed! sharename = %s, error = %u", pShareName, GetLastError());
    break;
    } m_pBuffer = MapViewOfFile(m_hMap,FILE_MAP_READ,0,0,0); if( !m_pBuffer )
    {
    LDB1(L"MapViewOfFile failed! %u", GetLastError());
    break;
    } strRet = string((char*)m_pBuffer); } while (false); return strRet;}BOOL ShareMemory::WriteShareMemory(const void* pData, int nCount, const WCHAR* pShareName)
    {
    BOOL bRet = FALSE; do 
    { m_hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024, pShareName); if( !m_hMap)
    {
    LCF1(L"CreateFileMapping failed! sharename = %s, error = %u", pShareName, GetLastError());
    break;
    } m_pBuffer = MapViewOfFile(m_hMap, FILE_MAP_WRITE, 0, 0, 0); if( !m_pBuffer )
    {
    break;
    } memcpy(m_pBuffer, pData, nCount); bRet = TRUE; } while (false); return bRet;
    }
      

  3.   

    你没明白我意思 我知道简单的数据可以共享 我是像实现共享表的方式  自动增加表  所以我使用CArray#pragma pack(1)
    typedef struct UserInfo
    {
        int User; 
        int PassWord;
        int PlayerName;
     
    }*LPUserInfo;
     
     
     
    typedef struct ShareMenoryArray
    {
        //CArray <UserInfo, UserInfo&> g_ClientArray; 把这里修改
        UserInfo m_User[255]   //固定数组对象长度  这样的方法就可以 但我想使用 CArray 的就不可以 因为不知道要几个对象啊 固定255 万一不够呢
      
    }*LPShareMenoryArray;
    #pragma pack()
      

  4.   

    首先检查Mapping的API都调用成功了么(两个EXE都要检查)
    可能由于Windows权限问题,内存映射根本没有成功然后不建议使用C++类作为Mapping的内容,除非你能确保类中没有使用任何的指针(一个进程的指针在另一个进程中无效),
    自己想想为什么CArray类能自动增长数组长度?他内部调用了malloc之类的本地内存分配函数,使得缓冲区增大,也就是CArray一定使用了本地指针
    你实际的数据保存在malloc得到的非共享的内存中,在共享内存里只是CArray本身的数据