下午修改個程式,需要在同一個解決方案下的不同的項目下通訊。同事提到了記憶體對應檔。原來是個挺好的類。
只要訪問同一個記憶體對應檔即可實現通訊。不同的項目都可以訪問(據說檔案記憶體中有儲存開啟次數的標誌-Num,每開啟一次,增加一,如果為0,自動釋放記憶體)。應用程式終止的時候,對應檔的記憶體被自動釋放。
記憶體對應檔,顧名思義,是個檔案。從最簡單的檔案操作入手。
HANDLE hMapFile; //對應檔控制代碼
LPVOID pMapFile;//檔案位移地址
檔案的建立:
CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(MyhssUser),Mystrfile);
參數詳解:
HANDLE CreateFileMapping( HANDLE hFile, //物理檔案控制代碼 LPSECURITY_ATTRIBUTES lpAttributes, //安全設定 DWORD flProtect, //保護設定 DWORD dwMaximumSizeHigh, //高位檔案大小 DWORD dwMaximumSizeLow, //低位檔案大小 LPCTSTR lpName //共用記憶體名稱 );
傳回值:HANDLE
寫檔案:
if( pMapFile != NULL ) {m_WriteFile = (MyhssUser *)pMapFile;//m_MyWriteFile是自訂的結構體strcpy(m_WriteFile->m_ID ,"1");strcpy(m_WriteFile->m_pwd , "1");}
開啟檔案:
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,Mystrfile);
參數說明:
dwDesiredAccess Long,帶有首碼FILE_MAP_???的一個常數。參考下個解釋。 bInheritHandle Long,如這個函數返回的控制代碼能由當前進程啟動的新進程繼承,則這個參數為TRUE。 lpName String,指定要開啟的檔案對應物件名稱
MapViewOfFile函數dwDesiredAccess參數的說明
hFileMappingObject Long,檔案對應物件的控制代碼。 dwDesiredAccess Long,下述常數之一: FILE_MAP_WRITE 映射可讀可寫。檔案對應物件必須通過PAGE_READWRITE訪問建立。 FILE_MAP_READ 映射唯讀。檔案對應物件必須通過PAGE_READ 或 PAGE_READWRITE訪問建立。 FILE_MAP_ALL_ACCESS 與FILE_MAP_WRITE相同。 FILE_MAP_COPY 映射時保留寫操作的副本。檔案對應物件必須用PAGE_WRITECOPY訪問在win95下建立 dwFileOffsetHigh Long,檔案中映射起點的高32位地址。 dwFileOffsetLow Long,檔案中映射起點的低32位地址。 dwNumberOfBytesToMap Long,檔案中要映射的位元組數。用零映射整個檔案對應物件。 lpBaseAddress Long,指定對應檔映射對象的地址。如這個地址處沒有足夠的記憶體空間,那麼對MapViewOfFileEx的調用會失效。零表示允許windows尋找一個地址。
讀檔案:
pMapFile = MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);//將一個檔案對應物件映射到當前應用程式的地址空間if( pMapFile != NULL ) {m_ReadFile = (MyhssUser*)pMapFile;m_ReadFile->m_ID="1";}
關閉檔案:
UnmapViewOfFile(pMapFile);CloseHandle(hMapFile);