怎样创建和读写共享内存?

 

读写的时候怎样锁定?

--------------------------------------------------------------- 16Windows中,有好几种方法可以共享数据。可能最普通的方法是使用属于另一个进程的窗口来调用SendMessage或者PostMessage。在16Windows中,这样只能传递一个16位值和一个32位值,。也可以使用GMEM_SHARE标志来分配一块全局内存,再调用SendMessage或者PostMessage来传送(作为参数wParamlParam)。消息的接收者再调用GlobalLock来得到内存块的地址,然后可以读写数据。

 

Win32中,每个进程有自己的地址空间,一个进程不能轻易地访问另一个进程地址空间中的数据,所以不能像16Windows那样做。Win32系统允许多个进程(运行在同一计算机上)使用内存映射文件来共享数据。实际上,其他共享和传送数据的技术,诸如使用SendMessage或者PostMessage,都在内部使用了内存映射文件。

 

这种数据共享是让两个或多个进程映射同一文件映射对象的视图,即它们在共享同一物理存储页。这样,当一个进程向内存映射文件的一个视图写入数据时,其他的进程立即在自己的视图中看到变化。但要注意,对文件映射对象要使用同一名字。

 

以下是一种解决方法的代码:

创建:

HANDLE s_hFileMap = CreateFileMapping((HANDLE)0XFFFFFFFF,NULL,PAGE_READWRITE, 0, 4*1024_TEXT("MyCustShareData"));

(此函数寻找一个名字为"MyCustShareData"的内存映射文件,不存在则创建,存在则返回已有的句柄,所以当返回值不为空的话,还须检查GetLastError,如果得到ERROR_ALREADY_EXISTS,则表明该名字的内存映射文件已经存在,并未创建成功)

 

读写:

HANDLE hFile = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, _TEXT("MyCustShareData"));//最后一个参数为名字,必须与创建的相同

if(hFile != NULL)

{

    LPVOID lpView =  MapViewOfFile(hFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);//将内存映射文件的一个视图映射到当前的地址空间

    if ((int *)lpView != NULL) 

    {

int sheardata = (int*)lpview; //

         (int *)lpview = 88; //

    }

    UpmapViewOfFile((LPVOID) lpview);

}

CloseHandle(hFile);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值