• 内存文件映射应用举例『转』


    下面这些函数被应用于文件内存映射中:

    1) CreateFileMapping
    2) FlushViewOfFile
    3) MapViewOfFile
    4) MapViewOfFileEx
    5) MapViewOfFileVlm
    6) OpenFileMapping
    7) UnmapViewOfFile  
    8) UnmapViewOfFileVlm

    函数详细说明:『见本页末』

    例子:

    /*****************************************************/
    /* */
    /*这个例子创建了文件映射视图,并通过这个映射 */
    /*视图来操作文件内容。 */
    /* */
    /****************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>

    int main()
    {
    HFILE hFile;
    OFSTRUCT opBuf;
    HANDLE hMapfile;
    HANDLE hMapview;
    BYTE *recv;
    hFile=OpenFile("D:\VC_project\Test1\Debug\map.test",&opBuf,OF_READWRITE);
    if (hFile==HFILE_ERROR)
    {
    printf("open file failed! ");
    return 1;
    }
    hMapfile=CreateFileMapping((HANDLE)hFile,NULL,PAGE_READWRITE,0,0,"MapTest");
    if(hMapfile==NULL)
    {
    printf("mapping file failed! ");
    return 1;
    }
    CloseHandle((HANDLE)hFile);
    hFile=0;
    hMapview=MapViewOfFile(hMapfile,FILE_MAP_WRITE,0,0,0);
    if(hMapview==NULL)
    {
    printf("mapping view failed! ");
    return 1;
    }
    recv=(BYTE *)hMapview;
    printf("Mapping view's content is :%.10s ",recv);
    recv[0]='s';
    printf("Mapping view's content is :%.10s ",recv);
    UnmapViewOfFile(hMapview);

    return 0;
    }

    一、CreateFileMapping 为指定文件创建一个有名或无名的文件映象;
    HANDLE CreateFileMapping(
    HANDLE hFile,              // 映射文件的句柄
    LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
                                 // 安全描述符指针
    DWORD flProtect,           // 对映射对象的保护
    DWORD dwMaximumSizeHigh,   // 对象最大长度的高32位
    DWORD dwMaximumSizeLow,    // 对象最大长度的低32位
    LPCTSTR lpName             // 文件内存映射对象的名字
    );

    注意:
    hFile:映射文件的句柄,文件的打开模式必须与flProtect参数指定的相一致;如果这个参数值为0xFFFFFFFF,那 么必须在dwMaximumSizeHigh和dwMaximumSizeLow参数中指定映射对象的大小。并且将在操作系统虚拟内存页面替换文件中创建 文件映射对象,而不是使用磁盘文件,同时必须给出这个映射对象的大小。文件映射对象通过副本,遗传或名字来共享。
    lpFileMappingAttributes:安全描述符指针,决定返回句柄是否能被子进程继承,如果是NULL,那么子进程不能继承。WinNt中,如果是NULL,那么文件映射对象得到一个默认的安全描述符。
    flProtect:为得到的文件试图指定保护模式,可以被设置为下列值:
    PAGE_READONLY :只读属性,并且hFile对应的文件必须以GENERIC_READ形式打开。
    PAGE_READWRITE:可读可写属性,并且hFile对应的文件必须以GENERIC_READ 和 GENERIC_WRITE形式打开。
    PAGE_WRITECOPY:对可写区域复制后操作,并且hFile对应的文件必须以GENERIC_READ 和 GENERIC_WRITE形式打开。
    dwMaximumSizeHigh,dwMaximumSizeLow:如果这两个参数为0,则文件映射对象的最大长度等于hFile指定的文件长度。
    lpName: 文件映射对象的名字,如果这个名字已存在,则按照flProtect指定的来处理映射对象。如果此参数为空,则创建一个无名字的文件映射对象。如果此参数 的名字与系统事件的名字相同,则函数执行失败,GetLastError返回 ERROR_INVALID_HANDLE;

    返回值:函数调用成功返回文件映射对象的句柄,如果文件映射对象已经存在则返回原有映射对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS。函数执行失败返回Null。

    二、FlushViewOfFile 把文件映射视图中的修改的内容或全部写回到磁盘文件中
    BOOL FlushViewOfFile(
    LPCVOID lpBaseAddress,       // 修改内容的起始地址
    DWORD dwNumberOfBytesToFlush // 修改的字节数目
    );
    函数执行成功返回非零。

    三、MapViewOfFile 在调用进程的地址空间映射一个文件视图
    LPVOID MapViewOfFile(
    HANDLE hFileMappingObject, // 已创建的文件映射对象句柄
    DWORD dwDesiredAccess,      // 访问模式
    DWORD dwFileOffsetHigh,     // 文件偏移的高32位
    DWORD dwFileOffsetLow,      // 文件偏移的低32位
    DWORD dwNumberOfBytesToMap // 映射视图的大小
    );
    注意:
    hFileMappingObject: 由CreateFileMapping 或 OpenFileMapping 返回的文件映射对象句柄。
    dwDesiredAccess:映射视图的访问模式,与创建文件映射对象的保护模式flProtect有关,可以被设置为下列值:
    FILE_MAP_WRITE:一个可读写属性的文件视图被创建,保护模式为PAGE_READWRITE
    FILE_MAP_READ :一个只读属性的文件视图被创建,保护模式为PAGE_READWRITE 或 PAGE_READONLY
    FILE_MAP_ALL_ACCESS:与FILE_MAP_WRITE模式相同
    FILE_MAP_COPY:保护模式为PAGE_WRITECOPY时,得到一个视图文件,当你对视图文件写操作时,页面自动交换,并且你所做的修改不会损坏原始数据资料。
    dwNumberOfBytesToMap:映射文件部分的大小,如果为0,则映射整个文件。
    返回值:
    如果成功返回返回映射视图的起始地址,如果失败返回NULL。

    四、MapViewOfFileEx 在调用进程的地址空间映射一个文件视图,并且允许调用进程为映射视图指定特殊的内存地址
    LPVOID MapViewOfFileEx(
    HANDLE hFileMappingObject, // 文件映射对象的句柄
    DWORD dwDesiredAccess,      // 访问模式
    DWORD dwFileOffsetHigh,     // 文件偏移的高32位
    DWORD dwFileOffsetLow,      // 文件偏移的低32位
    DWORD dwNumberOfBytesToMap, // 映射视图的大小
    LPVOID lpBaseAddress        // 指定映射视图的其实内存地址
    );
    注意:
    与MapViewOfFile用法相同,但是如果指定的内存地址空间大小不够,则函数执行失败。
    五、OpenFileMapping 打开一个已命名的文件映射对象
    HANDLE OpenFileMapping(
    DWORD dwDesiredAccess, // 访问模式
    BOOL bInheritHandle,    // 继承标志
    LPCTSTR lpName          // 文件映射对象名指针
    );
    注意:
    dwDesiredAccess:访问模式与MapViewOfFile中的访问模式相同。
    bInheritHandle:继承标志,是否可以被一个新的进程继承使用,如果为TRUE,就可以被一个新进程继承句柄。
    返回值:
    成功返回一个已命名的文件映射对象,失败返回NULL。

    六、UnmapViewOfFile 删除文件的映射视图
    BOOL UnmapViewOfFile(
    LPCVOID lpBaseAddress   // 映射视图起始地址
    );
    注意:
    lpBaseAddress:映射视图起始地址,由 MapViewOfFile 函数 MapViewOfFileEx产生。
    返回值:
    如果调用成功返回非零,并且所有指定地址内的脏页面会被写入硬盘。调用失败返回零。

    文档转载自:

    http://www.cppblog.com/sunraiing9/archive/2008/04/03/46171.aspx

  • 相关阅读:
    mongodb远程连接配置
    CentOs系统设置python版本
    python非官方模块下载大全
    Series.str——字符串批量处理方法
    gevent-协程用法
    与vnpy相关的有用博客网址
    vnpy官网说明文档网址
    Opencv各种编码器下视频文件大小对比
    Linux下python默认版本切换成替代版本
    CPU拓扑结构
  • 原文地址:https://www.cnblogs.com/roea1/p/14794588.html
Copyright © 2020-2023  润新知