<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}