现在的位置: 首页 > 综合 > 正文

创建内存共享的几个步骤:

2012年08月08日 ⁄ 综合 ⁄ 共 1730字 ⁄ 字号 评论关闭

创建共享内存分以下几个步骤:

    1.定义共享内存的结构体;

    2.利用CreateFileMapping函数创建共享内存;

    3.定义指向共享内存结构体的指针pShareMem,利用MapViewOfFile函数将刚刚创建的内存映射到定义指针pShareMem。

    读写共享内存分以下几个步骤:

    1.定义共享内存的结构体;

    2.用OpenFileMapping函数打开上面创建的共享内存区,该函数返回共享内存的地址;

    3.将共享内存映射为文件指针;

    4.定义指向共享内存结构体的指针,将共享内存的内容拷贝到结构体指针里。

HANDLE hMap;
HANDLE hAddress;
int iErrCode;

//第一步要定义所要共享的内容的结构体

typedef struct _TShareMem
{
    char Data[256];
}TShareMem;

void CreateMap()
{  
    CString strBuf;
    CString strShare = "共享内存";
    char szBuf[256];
    TShareMem* pShareMem;

    //创建共享内存,这个函数的最后一个参数即是创建的共享内存的名称 

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

    if ( hMap == NULL )  
    {
        iErrCode = GetLastError();
        AfxMessageBox("不能创建内存映射文件!");
    }
    //写共享内存区,将内存映射为文件
    pShareMem = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
    memcpy(pShareMem,strShare,strShare.GetLength());   

//或者代码如下:strcpy(pShareMem->Data,szBuf);

//或者用WriteProcessMemory(),代码如下:

 //HANDLE hProcess=::GetCurrentProcess();

//WriteProcessMemory(hProcess,pShareMem,szBuf, 256,0);

 


   

 

//打开刚刚创建的共享内存区,这里可以是另外一个进程中的代码   
    hMap = ::OpenFileMapping( FILE_MAP_WRITE, false, _T("NewMap"));
    if (hMap == 0 )
    {
        iErrCode = GetLastError();
        AfxMessageBox("不能定位内存映射文件块!");
    }

    //读共享内存区 
    hAddress = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
   // pShareMem = (TShareMem*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); 
    
    if ( hAddress == NULL )
        AfxMessageBox("Can''t View Memory Map");
   //对szBuf进行赋值,每个都是0
    memset(szBuf,0,sizeof(szBuf));

    //拷贝共享内存区的内容 
    CopyMemory(szBuf,hAddress,255);

//或者用strcpy(szBuf, hAddress);

//或者用ReadProcessMemory

// HANDLE hProcess=::GetCurrentProcess();

// ReadProcessMemory(hProcess,pShareMem,szBuf, 256,0);


    AfxMessageBox(szBuf);

//最后不要忘记释放内核对象

CloseHandle(hMap);

UnmapViewOfFile(hAddress);

}

抱歉!评论已关闭.