Windows API介绍及用法: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  } 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,你说得对。Windows API中的CreateFileMapping函数MapViewOfFile函数可以用来将一个文件映射到进程的虚拟地址空间中。这两个函数的原型分别如下: ``` HANDLE CreateFileMapping( HANDLE hFile, LPSECURITY_ATTRIBUTES lpAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName ); LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap ); ``` 其中,CreateFileMapping函数用于创建一个文件映射对象,它的参数包括文件句柄hFile、保护属性flProtect、最大文件映射大小等;MapViewOfFile函数用于将文件映射到进程的虚拟地址空间中,它的参数包括文件映射对象句柄hFileMappingObject、映射的起始地址等。 具体来说,我们可以使用CreateFileMapping函数创建一个文件映射对象,然后使用MapViewOfFile函数将文件映射到进程的虚拟地址空间中。比如,我们可以使用以下代码将一个遥感图像文件映射到内存中: ``` HANDLE hFile = CreateFile( "test.img", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); HANDLE hMapFile = CreateFileMapping( hFile, NULL, PAGE_READONLY, 0, 0, NULL ); LPBYTE pImage = (LPBYTE)MapViewOfFile( hMapFile, FILE_MAP_READ, 0, 0, 0 ); ``` 在这段代码中,我们首先使用CreateFile函数打开一个遥感图像文件,然后使用CreateFileMapping函数创建一个文件映射对象,并将其关联到文件句柄hFile上。最后,使用MapViewOfFile函数将文件映射到进程的虚拟地址空间中,并返回映射的起始地址pImage。 需要注意的是,当使用完毕后,需要使用UnmapViewOfFile函数将文件映射从进程的虚拟地址空间中解除映射,并使用CloseHandle函数关闭文件句柄和文件映射对象句柄,以释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值