`
freesoftman
  • 浏览: 319800 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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是共享数据长度。
  
调用函数的例子如下:
#001   //文件共享。
#002   //蔡军生 2007/10/27 QQ:9073204 深圳
#003   void FileMapping(void)
#004   {
#005          //打开共享的文件对象。
#006          m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,
#007               FALSE,_T("TestFileMap"));
#008          if (m_hMapFile)
#009          {
#010                //显示共享的文件数据。
#011               LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,
#012                    0,0,0);
#013                OutputDebugString(lpMapAddr);
#014          }
#015          else
#016          {
#017                //创建共享文件。
#018                m_hMapFile = CreateFileMapping( (HANDLE)0xFFFFFFFF,NULL,
#019                    PAGE_READWRITE,0,1024,_T("TestFileMap"));
#020  
#021                //拷贝数据到共享文件里。
#022                LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,
#023                     0,0,0);
#024                std::wstring strTest(_T("TestFileMap"));
#025                wcscpy(lpMapAddr,strTest.c_str());                  
#026  
#027                FlushViewOfFile(lpMapAddr,strTest.length()+1);
#028          }
#029   }

from:http://hi.baidu.com/wlcspace/blog/item/d40376ed8f8ea4dcb21cb1d9.html

分享到:
评论

相关推荐

    Windows进程间通信

    C++中可以结合Windows API的CreateFileMapping和MapViewOfFile函数实现共享内存。 三、消息队列(Message Queues) Windows的消息队列允许进程通过发送和接收消息进行通信。C++开发者可以使用PostMessage和...

    VC的简单通信

    在VC中,可以使用CreateFileMapping和MapViewOfFile函数创建和访问共享内存。 **4. 套接字通信** 套接字主要用于网络通信,使得运行在不同计算机上的进程可以相互通信。VC提供了Winsock库,包含了创建、连接和发送/...

    基于Windows的进程间通信(IPC)的一些代码示例_C++_C_下载.zip

    在Windows中,可以使用CreateFileMapping和MapViewOfFile函数来创建和访问共享内存。 3. **消息队列**:消息队列允许进程之间通过发送和接收消息进行通信。Windows操作系统提供了CreateMsgQueue函数来创建消息队列...

    Windows共享内存使用方法

    在Windows系统中,我们通常使用CreateFileMapping和MapViewOfFile函数来创建和访问共享内存。以下是具体步骤: 1. **创建共享内存**:首先,使用CreateFileMapping函数创建一个内存映射文件。这个函数需要指定文件...

    进程间通讯 DEMO

    Delphi7中可以使用CreateFileMapping和MapViewOfFile函数来创建和操作内存映射文件。 在DEMO中,可能包含了创建通信对象、建立连接、发送和接收数据、错误处理等基本步骤。理解DEMO的实现,有助于开发者深入掌握...

    通过APIHOOK钩子CreateFileMapping实现进程间密钥的传递.zip

    2. 获取映射视图的地址,使用MapViewOfFile函数将映射对象的一部分加载到进程的地址空间。 3. 在共享内存中写入或读取数据,如密钥。 4. 当不再需要共享内存时,使用UnmapViewOfFile卸载视图,并用CloseHandle关闭...

    WINDOW_MMFShare.rar_MFC共享内存_windows核心编程_共享内存

    在Windows系统中,共享内存主要通过CreateFileMapping和MapViewOfFile函数来创建和映射。CreateFileMapping用于创建一个文件映射对象,而MapViewOfFile则将该对象映射到进程的地址空间。 在“17-MMFShare”这个可能...

    Windows下的多进程间通信及数据共享

    一旦创建了FileMapping对象,就可以使用MapViewOfFile函数将其映射到当前进程的虚拟地址空间中。MapViewOfFile函数将返回一个指向共享内存的指针,从而实现了多个进程之间的数据共享。 在使用完共享内存后,需要...

    内存映射读写文件的方法

    在VC++(Visual C++)环境下,我们可以利用Windows API中的CreateFileMapping和MapViewOfFile函数来实现内存映射文件的操作。 首先,理解内存映射文件的基本概念至关重要。内存映射文件并不是真的将整个文件加载到...

    C++共享内存进程间通信 demo

    在C++中,Windows API提供了CreateFileMapping和MapViewOfFile函数来创建和映射文件映射对象,从而实现共享内存。首先,我们需要使用CreateFileMapping函数创建一个文件映射对象,该对象可以理解为一个内存区域的...

    MFC两进程间内存共享源码

    在Windows操作系统中,我们可以使用CreateFileMapping和MapViewOfFile函数来创建和映射共享内存区域。在MFC中,这些功能可以通过CSharedMemory类来包装,该类提供了更友好的接口。 在标题中提到的两个工程中,第一...

    C++实现多线程文件复制.docx

    通过使用CreateFileMapping和MapViewOfFile函数,可以创建文件映射对象,并将其映射到内存中。 三、多线程文件复制的实现步骤 1. 创建线程函数 首先,需要创建线程函数,用于复制文件的一部分。在给定的代码中,...

    CreateFileMapping

    本文将详尽地探讨`CreateFileMapping`的工作原理、使用方法及其在实际开发中的应用。 一、`CreateFileMapping`函数简介 `CreateFileMapping`函数通过指定的文件句柄创建一个内存映射对象,这个对象可以被多个进程...

    Winodws平台C++共享内存实现(万恶的CSDN)

    2. 映射视图:同样使用MapViewOfFile函数将内存对象映射到进程地址空间。 3. 读取数据:从映射的内存区域读取数据。 4. 释放资源:完成数据读取后,调用UnmapViewOfFile和CloseHandle进行资源释放。 这个C++类可能...

    进程通信,建立共享内存

    资源中的"www.pudn.com.txt"可能是文档说明,详细解释了代码的使用方法和工作原理;"进程通信"很可能是源代码文件,包含了上述提到的各个功能模块。 通过学习这个例子,开发者可以深入理解如何在实际项目中应用共享...

    VC实现进程之间的通讯

    在VC中,可以使用CreateFileMapping和MapViewOfFile函数来创建和访问共享内存。 3. **消息队列**:消息队列是另一种进程间通信方式,进程将消息放入队列,其他进程可以从队列中取出。在Windows API中,可以使用...

    CreateFile函数扩展用法.rar

    - 文件映射:通过`CreateFile`配合`CreateFileMapping`和`MapViewOfFile`,可以实现内存映射文件,提高大文件的访问效率。 - 设备I/O:除了文件,`CreateFile`还可以用于控制硬件设备,如打印机、串口等,通过特定...

    利用内存映射文件实现的进程间的通信实例

    在Windows API中,可以使用CreateFileMapping和MapViewOfFile函数来创建和映射内存映射文件。首先,我们需要创建一个文件并填充数据,然后创建一个文件映射对象。文件映射对象是内存映射文件的核心,它定义了映射的...

    MFC程序大文件切割与合并源码

    Windows中的CreateFileMapping和MapViewOfFile函数可用于创建文件映射对象和映射视图,MFC则通过CMemFile和CMapFile类提供了封装。通过内存映射,大文件的读写可以避免频繁的磁盘I/O,提高效率。 此外,描述中提到...

    易语言调用API实现快照源码

    2. **获取映射视图**:接着,使用MapViewOfFile函数将内存映射文件映射到进程的地址空间中,这样就可以像操作普通内存一样操作这个文件。 3. **复制数据**:在映射的内存区域中,将要快照的数据复制进去。这可能...

Global site tag (gtag.js) - Google Analytics