memory map怎么实现?

发布于 2021-11-05 18:46:27 字数 74 浏览 742 评论 4

两个MFC应用程序,其中一个通过m_mmf = new CMemMapFile[2]建立了两个映射文件,另一个应用程序怎么去用这个程序的映射文件呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

德意的啸 2021-11-11 12:03:18

怎么才能使映射的句柄可以在另一个进程中使用呢?怎么实现?

温柔少女心 2021-11-11 10:54:32

http://www.oschina.net/code/snippet_54100_5889

高跟鞋的旋律 2021-11-11 10:42:47

在Win32中,每个进程有自己的地址空间,一个进程不能轻易地访问另一个进程地址空间中的数据,所以不能像16位Windows那样做。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);

 

其中MapViewOfFile的原型如下所示:

 LPVOID   MapViewOfFile(

     HANDLE   hFileMappingObject,       //   映射文件对象的句柄

     DWORD   dwDesiredAccess,               //   访问模式

     DWORD   dwFileOffsetHigh,             //   位移的高位

     DWORD   dwFileOffsetLow,               //   位移的低位(与前一个参数一起构成64位的位移量)

     SIZE_T   dwNumberOfBytesToMap     //   映射量(单位为Byte,当设为0时表示映射整个文件)

 );

 

您所提到的mapviewoffileEx函数的原型如下所示:

 LPVOID   MapViewOfFileEx(

     HANDLE   hFileMappingObject,      

     DWORD   dwDesiredAccess,              

     DWORD   dwFileOffsetHigh,            

     DWORD   dwFileOffsetLow,              

     SIZE_T   dwNumberOfBytesToMap,  

     LPVOID   lpBaseAddress                  

 );

 

其中前五个参数的含义同上,第六个参数给出一个调用映射文件的进程的地址,要求文件映射从该地址开始。这个值必须是一个系统内存分配的最小粒度的整数倍,否则此函数调用失败。要获得内存分配的粒度,可以调用GetSystemInfo函数。如果指定的内存地址没有足够的空间,则函数也失败。

 

如果此参数的值设为NULL,则操作系统选择从何地址开始进行文件映射,这样,函数的功能与MapViewOfFile相同。

 

   

 关于内存映射文件的进一步的信息,您可以参看:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/filemap_61d3.asp和

 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/filemap_2it4.asp等有关信息。

    

 -     微软全球技术中心     VC技术支持

    

 本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款

 (
http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。

    

 为了为您创建更好的讨论环境,请参加我们的用户满意度调查

 (
http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文