Windows API一日一練(59)CreateFileMapping和MapViewOfFile函數
來源:互聯網
上載者:User
在開發軟體過程裡,也經常碰到進程間共用資料的需求。比如A進程建立計算資料,B進程進行顯示資料的圖形。這樣的開發方式可以把一個大程式分開成獨立的小程式,提高軟體的成功率,也可以更加適合團隊一起開發,加快軟體的開發速度。下面就來使用檔案對應的方式進行共用資料。先要使用函數CreateFileMapping來建立一個想共用的檔案資料控制代碼,然後使用MapViewOfFile來擷取共用的記憶體位址,然後使用OpenFileMapping函數在另一個進程裡開啟共用檔案的名稱,這樣就可以實現不同的進程共用資料。 函數CreateFileMapping、MapViewOfFile聲明如下:WINBASEAPI__outHANDLEWINAPICreateFileMappingA( __in HANDLE hFile, __in_opt LPSECURITY_ATTRIBUTES lpFileMappingAttributes, __in DWORD flProtect, __in DWORD dwMaximumSizeHigh, __in DWORD dwMaximumSizeLow, __in_opt LPCSTR lpName );WINBASEAPI__outHANDLEWINAPICreateFileMappingW( __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__outLPVOIDWINAPIMapViewOfFile( __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 }