预期目的: 进程A exe 当进程B打开某窗口挂载线程钩子DLL,监听鼠标消息.想在挂载钩子的时候申请内存


嵌套结构体如下:

typedef struct strTmpGroup

{

strTmpGroup()

{

pList = NULL;

}

CString strTmpGroupName;

CListUIEx* pList;

TmpLinkMan_t strTmpLinkList;

}strTmpGroup;


typedef std::list<strTmpGroup> strTmpGroupList_t;

typedef std::list<strTmpGroup>::iterator strTmpGroupIter_t;

typedef struct stGroupUser_t

{

stGroupUser_t()

{

pTmpGroupList = NULL;

}

strTmpGroupList_t* pTmpGroupList;        //std::list

}stGroupUser_t;


主程序写入内存:

//创建映射数据

void CreateMemMap( )

{

    HANDLE hMap;

    stGroupUser_t* pShareMem;

    //创建共享内存,最后一个参数为创建的共享内存名称 

    hMap=::CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,sizeof(stGroupUser_t),_T("MyShareMap"));

    if ( hMap == NULL )  

    {

        AfxMessageBox(_T("不能创建内存映射文件!"));

    }

    //写共享内存区,将内存映射为文件

    pShareMem = (stGroupUser_t*)MapViewOfFile(hMap, FILE_MAP_WRITE,0, 0, 0);

   strTmpGroupList_t* pTmpGroupList = new strTmpGroupList_t;

}



DLL读取内存数据:

void ReadMemMap()

{

HANDLE hMap;

HANDLE hAddress;

//读共享内存

hMap = ::OpenFileMapping( FILE_MAP_WRITE, false, _T("MyShareMap"));

if (hMap == 0 )

MessageBox(NULL,_T("读取共享内存!"),_T("提示"),MB_OK);


hAddress = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);

if ( hAddress == NULL )

MessageBox(NULL,_T("不能打开映射文件!"),_T("提示"),MB_OK);

stGroupUser_t* pShareMem;

pShareMem = (stGroupUser_t*)hAddress;

//释放

CloseHandle(hMap);

    UnmapViewOfFile(hAddress);

}


遇到问题:

    在stGroupUser_t结构体中添加char 赋值在进程B中能访问到这个数据.无法访问pTmpGroupList内存地址 pTmpGroupList.empty()报错为0x000000


    查找资料得到结论:

     共享内存映射文件不能使用CString类型成员变量和任何指针类型的。

     主要是 CString 內存大小無法控制, 所以不能用在大多數的 IPC 上面.