Windows API一日一練(59)CreateFileMapping和MapViewOfFile函數

Post date: 2012/3/27 上午 08:25:05

分類: Direct3D2007-10-27 22:33 13972人閱讀 評論(5) 收藏 舉報

在開發軟體過程裏,也經常碰到進程間共用資料的需求。比如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 }