共享内存——如何在本地没有句柄的两个地方互传数据
Posted IceArrow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了共享内存——如何在本地没有句柄的两个地方互传数据相关的知识,希望对你有一定的参考价值。
一直对匿名管道这个名字有着相当的兴趣,然而至今没有完全弄明白匿名管道的原理,可能本人的记忆属于感觉型的,没有经历过的东西印象始终不深,以至于一些技术虽然当时理解了,一段时间之后使大抵的都忘了。
现在有一种更简单,且觉得相当实用的数据传递方法,记录下来以加深记忆。
共享内存
其实微软件的sendmessage、postmessage内部实现也使用了内存共享技术,该技术初衷是用于解决大文件的频繁读写操作,通过创建一个内核对象的方式,将文件直接映射在内存中,并且提交物理内存到该内存空间,如此一来省去了读写的I/O操作,也不需要为文件开辟缓冲区域。多个进程可以打开该文件内核(内存)进行操作。
这里的用法是创建一个文件无关的文件内存映射,来进行数据交换,如此一来有一块内存是共享的,在不同的进程中都可以读写,相当的方便。
与匿名管道类似,没有同步驱动机制。但是这一点可以通过写入窗口句柄之后,再使用sendmessage、postmessge等方式协调的完成整个过程。
贴出部分代码,大家共勉
1.创建部分
HANDLE m_hShareHandle = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,dwMapSize,_T("Share"));//创建一个共享内存 if(m_hShareHandle) { m_lpShare = MapViewOfFile(m_hShareHandle,FILE_MAP_WRITE,0,0,dwMapSize);//为该内存为分配空间 if(m_lpShare) { char* pBuff = ...//ur code strncpy((char*)m_lpShare,pBuff,strHandle.GetLength());//向其中写入数据 delete []pBuff; } }
2.接收部分
HANDLE hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,_T("Share"));//打开共享内存 if(hMap) { char *lp = (char*)MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);//读该内存
....//ur code
UnmapViewOfFile(lp); CloseHandle(hMap);//关闭内存映射
} return S_OK;
文件无关的使用方式如此即可。涉及文件读写的,后续更新了吧 多关随缘了 : )
以上是关于共享内存——如何在本地没有句柄的两个地方互传数据的主要内容,如果未能解决你的问题,请参考以下文章