windows内存映射机制

本文介绍Win32系统中使用内存映射文件实现进程间数据共享的方法。通过创建和映射同一个文件映射对象,不同进程可以共享同一块内存区域并实时同步数据更改。文章提供了创建和读写内存映射文件的具体示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在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相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值