• CreateFileMapping和MapViewOfFile函数


    在开发软件过程里,也经常碰到进程间共享数据的需求。比如A进程创建计算数据,B进程进行显示数据的图形。这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开发,加快软件的开发速度。之前讲过一种使用命名管道的方式实现,下面就来使用文件映射的方式进行共享数据。先要使用函数CreateFileMapping来创建一个想共享的文件数据句柄,然后使用MapViewOfFile来获取共享的内存地址,然后使用OpenFileMapping函数在另一个进程里打开共享文件的名称,这样就可以实现不同的进程共享数据。

    函数CreateFileMapping、MapViewOfFile声明如下:

    WINBASEAPI
    __out
    HANDLE
    WINAPI
    CreateFileMappingA(
        __in     HANDLE hFile,
        __in_opt LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
        __in     DWORD flProtect,
        __in     DWORD dwMaximumSizeHigh,
        __in     DWORD dwMaximumSizeLow,
        __in_opt LPCSTR lpName
        );
    WINBASEAPI
    __out
    HANDLE
    WINAPI
    CreateFileMappingW(
        __in     HANDLE hFile,
        __in_opt LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
        __in     DWORD flProtect,
        __in     DWORD dwMaximumSizeHigh,
        __in     DWORD dwMaximumSizeLow,
        __in_opt LPCWSTR lpName
        );
    #ifdef UNICODE
    #define CreateFileMapping CreateFileMappingW
    #else
    #define CreateFileMapping CreateFileMappingA
    #endif // !UNICODE
     
    WINBASEAPI
    __out
    LPVOID
    WINAPI
    MapViewOfFile(
        __in HANDLE hFileMappingObject,
        __in DWORD dwDesiredAccess,
        __in DWORD dwFileOffsetHigh,
        __in DWORD dwFileOffsetLow,
        __in SIZE_T dwNumberOfBytesToMap
        );

    hFile是创建共享文件的句柄。

    lpFileMappingAttributes是文件共享的属性。

    flProtect是当文件映射时读写文件的属性。

    dwMaximumSizeHigh是文件共享的大小高位字节。

    dwMaximumSizeLow是文件共享的大小低位字节。

    lpName是共享文件对象名称。

    hFileMappingObject是共享文件对象。

    dwDesiredAccess是文件共享属性。

    dwFileOffsetHigh是文件共享区的偏移地址。

    dwFileOffsetLow是文件共享区的偏移地址。

    dwNumberOfBytesToMap是共享数据长度。

    调用函数的例子如下:

    //文件共享。
       void FileMapping(void)
       {
              //打开共享的文件对象。
              m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,_T("TestFileMap"));
              if (m_hMapFile)
              {
                    //显示共享的文件数据。
                   LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,
                        0,0,0);
                    OutputDebugString(lpMapAddr);
              }
              else
              {
                    //创建共享文件。
                    m_hMapFile = CreateFileMapping( (HANDLE)0xFFFFFFFF,NULL,
                        PAGE_READWRITE,0,1024,_T("TestFileMap"));
     
                    //拷贝数据到共享文件里。
                    LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,
                        0,0,0);
                    std::wstring strTest(_T("TestFileMap"));
                    wcscpy(lpMapAddr,strTest.c_str());                
      
                    FlushViewOfFile(lpMapAddr,strTest.length()+1);
              }
       }


     

    云腾软件
  • 相关阅读:
    c traps and pitfalls reading note(1)
    比较好的进程篇总结(转)
    shell学习日志
    IPC--消息队列
    c进程学习日志
    c--socket通信TCP篇
    c语言文件操作总结
    c的面向对象思想记录
    c指针学习小结(参考别人总结的经验)
    vi 学习记录
  • 原文地址:https://www.cnblogs.com/yongqiangyue/p/3984787.html
Copyright © 2020-2023  润新知