關於內存映射文件記錄

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章