預期目的: 進程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 上面.