预期目的: 进程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 上面.
原文地址:http://evely.blog.51cto.com/1089422/1637981