zoukankan      html  css  js  c++  java
  • CreateFileMapping 函数


    内存映射API函数CreateFileMapping创建一个有名的共享内存:
    HANDLE CreateFileMapping(
    HANDLE hFile,                                                                        // 映射文件的句柄,
                                                                                                       //设为0xFFFFFFFF以创建一个进程间共享的对象
    LPSECURITY_ATTRIBUTES lpFileMappingAttributes,   // 安全属性
    DWORD flProtect,                                                                   // 保护方式
    DWORD dwMaximumSizeHigh,                                           //对象的大小
    DWORD dwMaximumSizeLow,
    LPCTSTR lpName                                                                 // 必须为映射文件命名
    );

    与虚拟内存类似,保护方式可以是PAGE_READONLY或是PAGE_READWRITE。如果多进程都对同一共享内存进行写访问,则必须保持相互间同步。映射文件还可以指定PAGE_WRITECOPY标志,可以保证其原始数据不会遭到破坏,同时允许其他进程在必要时自由的操作数据的拷贝。

    在创建文件映射对象后使用可以调用MapViewOfFile函数映射到本进程的地址空间内。

    下面说明创建一个名为MySharedMem的长度为4096字节的有名映射文件:
    HANDLE hMySharedMapFile=CreateFileMapping((HANDLE)0xFFFFFFFF),
    NULL,PAGE_READWRITE,0,0x1000,"MySharedMem");
    并映射缓存区视图:
    LPSTR pszMySharedMapView=(LPSTR)MapViewOfFile(hMySharedMapFile,
    FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

    其他进程访问共享对象,需要获得对象名并调用OpenFileMapping函数。
    HANDLE hMySharedMapFile=OpenFileMapping(FILE_MAP_WRITE,
    FALSE,"MySharedMem");

    一旦其他进程获得映射对象的句柄,可以象创建进程那样调用MapViewOfFile函数来映射对象视图。用户可以使用该对象视图来进行数据读写操作,以达到数据通讯的目的。

    当用户进程结束使用共享内存后,调用UnmapViewOfFile函数以取消其地址空间内的视图:
    if (!UnmapViewOfFile(pszMySharedMapView))
    {

             AfxMessageBox("could not unmap view of file");

     }

    void CreateFileMappingEx()
    {
    DWORD timebegin = ::timeGetTime();
    HANDLE fp = CreateFile(TEXT("E:\\jyzhj2.rar"),//这里输入需要复制的文件 src
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_SEQUENTIAL_SCAN,
    NULL);

    if(fp == NULL)
    {
    cout<<"错误"<<endl;
    return;
    }

    DWORD dwBytesInBlock = GetFileSize(fp,NULL); //文件长度

    // 创建文件映射内核对象,句柄保存于hFileMapping
    HANDLE hFileMapping = CreateFileMapping(fp,
    NULL,
    PAGE_READWRITE,
    0,//(DWORD)(dwBytesInBlock >> 16),
    dwBytesInBlock,//(DWORD)(dwBytesInBlock & 0x0000FFFF),
    NULL);

    int dwError = GetLastError();

    // 释放文件内核对象
    CloseHandle(fp);

    // 偏移地址
    __int64 qwFileOffset = 0;

    // 将文件数据映射到进程的地址空间
    LPVOID pbFile = (LPVOID)MapViewOfFile( hFileMapping,
    FILE_MAP_ALL_ACCESS,
    (DWORD)(qwFileOffset >> 32),
    (DWORD)(qwFileOffset & 0xFFFFFFFF),
    dwBytesInBlock);

    HANDLE wp = CreateFile( TEXT("E://仙剑5.rar"),//这里输入 需要粘贴的文件 dst
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_WRITE,
    NULL,
    CREATE_ALWAYS,
    FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_WRITE_THROUGH,
    NULL);

    HANDLE hFileMapping2 = CreateFileMapping( wp,
    NULL,
    PAGE_READWRITE,
    0,//(DWORD)(dwBytesInBlock >> 16),
    dwBytesInBlock,//(DWORD)(dwBytesInBlock & 0x0000FFFF),
    NULL);


    CloseHandle(wp);

    LPVOID pbFile2 = (LPVOID)MapViewOfFile( hFileMapping2,
    FILE_MAP_ALL_ACCESS,
    (DWORD)(qwFileOffset >> 32),
    (DWORD)(qwFileOffset & 0xFFFFFFFF),
    dwBytesInBlock);

    memcpy(pbFile2,pbFile,dwBytesInBlock);

    UnmapViewOfFile(pbFile2);
    UnmapViewOfFile(pbFile);

    CloseHandle(hFileMapping2);
    CloseHandle(hFileMapping);
    DWORD timeend = ::timeGetTime();
    cout<<"CreateFileMapping和MapViewOfFile程序运行时间为"<<timeend - timebegin<<endl;
    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ocean1004/archive/2009/02/25/3937223.aspx

  • 相关阅读:
    借Adobe XD之力,自动生成Flutter代码
    阿里云移动研发平台体验报告
    一年的时间,我出版了一本实体书
    论一个前端开发者的自我修养
    es6 中模块的使用总结
    vue前端UI框架收集
    页面布局进化史
    JSON是一种轻量级数据交换格式
    web图片裁切插件 cropper.js 详细介绍
    css3中的@font-face你真的了解吗
  • 原文地址:https://www.cnblogs.com/lancidie/p/1949437.html
Copyright © 2011-2022 走看看