CreateFileMapping和MapViewOfFile函数
2016-06-23 07:32
459 查看
在开发软件过程里,也经常碰到进程间共享数据的需求。比如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 //
#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 }
函数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 //
#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 }
相关文章推荐
- mysql-5.5.50-winx64 on x86 (MySQL Community Server (GPL))
- 微信支付接入指南
- .NET Core 使用Dapper 操作MySQL
- 飞贷app,资金从银行到生意人
- Android随心笔记一:Android自定义View的3个构造方法一般何时使用
- android中自定义view涉及到的绘制知识
- iOS中生成并导入基于Swift编程语言的Framework
- iOS设置圆角及圆形图片
- Android开发中的问题
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- Android开发中的小技巧
- [Webpack 2] Chunking common modules from multiple apps with the Webpack CommonsChunkPlugin
- android NDK实现
- Android如何高效加载大图
- 6月20日--swift3常量与变量
- iOS框架MVC+MVVM结合的实战
- iOS Git的使用方法(sourcetree)
- 安卓学习之路—ListView的分栏显示 —标识元素类型
- Android自定义alertDialog和对话框中的点击事件
- android_path的子类