在开发软件过程里,也经常碰到进程间共享数据的需求。比如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
分享到:
相关推荐
C++中可以结合Windows API的CreateFileMapping和MapViewOfFile函数实现共享内存。 三、消息队列(Message Queues) Windows的消息队列允许进程通过发送和接收消息进行通信。C++开发者可以使用PostMessage和...
在VC中,可以使用CreateFileMapping和MapViewOfFile函数创建和访问共享内存。 **4. 套接字通信** 套接字主要用于网络通信,使得运行在不同计算机上的进程可以相互通信。VC提供了Winsock库,包含了创建、连接和发送/...
在Windows中,可以使用CreateFileMapping和MapViewOfFile函数来创建和访问共享内存。 3. **消息队列**:消息队列允许进程之间通过发送和接收消息进行通信。Windows操作系统提供了CreateMsgQueue函数来创建消息队列...
在Windows系统中,我们通常使用CreateFileMapping和MapViewOfFile函数来创建和访问共享内存。以下是具体步骤: 1. **创建共享内存**:首先,使用CreateFileMapping函数创建一个内存映射文件。这个函数需要指定文件...
Delphi7中可以使用CreateFileMapping和MapViewOfFile函数来创建和操作内存映射文件。 在DEMO中,可能包含了创建通信对象、建立连接、发送和接收数据、错误处理等基本步骤。理解DEMO的实现,有助于开发者深入掌握...
2. 获取映射视图的地址,使用MapViewOfFile函数将映射对象的一部分加载到进程的地址空间。 3. 在共享内存中写入或读取数据,如密钥。 4. 当不再需要共享内存时,使用UnmapViewOfFile卸载视图,并用CloseHandle关闭...
在Windows系统中,共享内存主要通过CreateFileMapping和MapViewOfFile函数来创建和映射。CreateFileMapping用于创建一个文件映射对象,而MapViewOfFile则将该对象映射到进程的地址空间。 在“17-MMFShare”这个可能...
一旦创建了FileMapping对象,就可以使用MapViewOfFile函数将其映射到当前进程的虚拟地址空间中。MapViewOfFile函数将返回一个指向共享内存的指针,从而实现了多个进程之间的数据共享。 在使用完共享内存后,需要...
在VC++(Visual C++)环境下,我们可以利用Windows API中的CreateFileMapping和MapViewOfFile函数来实现内存映射文件的操作。 首先,理解内存映射文件的基本概念至关重要。内存映射文件并不是真的将整个文件加载到...
在C++中,Windows API提供了CreateFileMapping和MapViewOfFile函数来创建和映射文件映射对象,从而实现共享内存。首先,我们需要使用CreateFileMapping函数创建一个文件映射对象,该对象可以理解为一个内存区域的...
在Windows操作系统中,我们可以使用CreateFileMapping和MapViewOfFile函数来创建和映射共享内存区域。在MFC中,这些功能可以通过CSharedMemory类来包装,该类提供了更友好的接口。 在标题中提到的两个工程中,第一...
通过使用CreateFileMapping和MapViewOfFile函数,可以创建文件映射对象,并将其映射到内存中。 三、多线程文件复制的实现步骤 1. 创建线程函数 首先,需要创建线程函数,用于复制文件的一部分。在给定的代码中,...
本文将详尽地探讨`CreateFileMapping`的工作原理、使用方法及其在实际开发中的应用。 一、`CreateFileMapping`函数简介 `CreateFileMapping`函数通过指定的文件句柄创建一个内存映射对象,这个对象可以被多个进程...
2. 映射视图:同样使用MapViewOfFile函数将内存对象映射到进程地址空间。 3. 读取数据:从映射的内存区域读取数据。 4. 释放资源:完成数据读取后,调用UnmapViewOfFile和CloseHandle进行资源释放。 这个C++类可能...
资源中的"www.pudn.com.txt"可能是文档说明,详细解释了代码的使用方法和工作原理;"进程通信"很可能是源代码文件,包含了上述提到的各个功能模块。 通过学习这个例子,开发者可以深入理解如何在实际项目中应用共享...
在VC中,可以使用CreateFileMapping和MapViewOfFile函数来创建和访问共享内存。 3. **消息队列**:消息队列是另一种进程间通信方式,进程将消息放入队列,其他进程可以从队列中取出。在Windows API中,可以使用...
- 文件映射:通过`CreateFile`配合`CreateFileMapping`和`MapViewOfFile`,可以实现内存映射文件,提高大文件的访问效率。 - 设备I/O:除了文件,`CreateFile`还可以用于控制硬件设备,如打印机、串口等,通过特定...
在Windows API中,可以使用CreateFileMapping和MapViewOfFile函数来创建和映射内存映射文件。首先,我们需要创建一个文件并填充数据,然后创建一个文件映射对象。文件映射对象是内存映射文件的核心,它定义了映射的...
Windows中的CreateFileMapping和MapViewOfFile函数可用于创建文件映射对象和映射视图,MFC则通过CMemFile和CMapFile类提供了封装。通过内存映射,大文件的读写可以避免频繁的磁盘I/O,提高效率。 此外,描述中提到...
2. **获取映射视图**:接着,使用MapViewOfFile函数将内存映射文件映射到进程的地址空间中,这样就可以像操作普通内存一样操作这个文件。 3. **复制数据**:在映射的内存区域中,将要快照的数据复制进去。这可能...