Windows API一日一练(59)CreateFileMapping和MapViewOfFile函数

<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
在开发软件过程里,也经常碰到进程间共享数据的需求。比如 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 CreateFileMappingCreateFileMappingW
#else
#define CreateFileMappingCreateFileMappingA
#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 深圳
#003void 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}



你可能感兴趣的:(windows)