Win32学习笔记(21)内存映射文件

1.什么是内存映射文件

 

如上图:内存映射文件意思就是吧一个硬盘上的文件映射到物理页上在把物理页映射到虚拟内存上。

这样的好处是不必再打开、关闭文件,直接像访问自己的内存一样想读就读想写就写,想要读写文件时候就直接读写内存。还有一个很大的优点就是当文件很大的时候使用这种方式会有很好的性能。

下面我们尝试用代码实现

介绍下CreateFileMapping()函数,这个可以理解为准备物理内存的。在之前的物理内存中我们也知道,这个函数是来实现多个进程公用物理页的。他还可以把硬盘上的内容映射到物理页上(把文件句柄)

HANDLE CreateFileMappingA(
  [in]           HANDLE                hFile,
  [in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  [in]           DWORD                 flProtect,
  [in]           DWORD                 dwMaximumSizeHigh,
  [in]           DWORD                 dwMaximumSizeLow,
  [in, optional] LPCSTR                lpName
);

MapViewOfFile()函数:把物理内存与虚拟内存关联(就是最上面图中左边的箭头)

当执行完后我们会得到一个地址,我们代码中得到的就是虚拟内存的地址。然后我们就可以使用这个地址了。(下面我们读取地址)

LPVOID MapViewOfFile(
  [in] HANDLE hFileMappingObject,
  [in] DWORD  dwDesiredAccess,
  [in] DWORD  dwFileOffsetHigh,
  [in] DWORD  dwFileOffsetLow,
  [in] SIZE_T dwNumberOfBytesToMap
);

#include"stdafx.h"
#include<stdio.h>
#include<Windows.h>
DWORD MappingFile(LPSTR lpcFile)
{
    HANDLE hFile;
    HANDLE hMapFile;
    DWORD dwFileMapSize;
    LPVOID lpAddr;
​
    //1.得到文件句柄
    hFile = CreateFileA(lpcFile,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL
        );
    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile 失败:%d \n", GetLastError());
        return 0;
    }
​
    //2.创
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wzprabbit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值