通過記憶體對映實現程序間資料交換
程序間通訊有好幾种放發,其中共享記憶體可以實現大量快速得資料交換,
現簡單介紹下這種方法得基本原理
所用API函式說明:
HANDLE CreateFileMapping(
HANDLE hFile, // handle to file to map ,//物理檔案控制代碼
//設為0xFFFFFFFF以建立一個程序間共享的物件
LPSECURITY_ATTRIBUTES lpFileMappingAttributes, //安全設定
// optional security attributes
DWORD flProtect, // protection for mapping object 保護設定
DWORD dwMaximumSizeHigh, // high-order 32 bits of object size//高位檔案大小
DWORD dwMaximumSizeLow, // low-order 32 bits of object size//低位檔案大小
LPCTSTR lpName // name of file-mapping object //共享記憶體名稱
);
// 檔案對映到記憶體。
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // file-mapping object to map into 對映檔案物件控制代碼
// address space
DWORD dwDesiredAccess, // access mode 訪問模式
DWORD dwFileOffsetHigh, // high-order 32 bits of file offset
DWORD dwFileOffsetLow, // low-order 32 bits of file offset
DWORD dwNumberOfBytesToMap // number of bytes to map對映試檢視大小
);
//把檔案對映到程序地址空間。
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress // address where mapped view begins
); //釋放影像記憶體。
//-------------------------------------------------------------------------------------------------------------------------------------------
主程序:(Server)
UpdateData(true);
HANDLE hMapping ;
LPSTR lpData;
hMapping=CreateFileMapping(HANDLE(0xFFFFFFFF),NULL,PAGE_READWRITE,0,0x100,"MyShare");
//建立一個名為MyShare的長度為0x100位元組的有名對映檔案
if(hMapping==NULL)
{
MessageBox("CreateFileMapping failed");
return ;
}
lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpData==NULL)
{
MessageBox("MapViewOfFile failed");
return ;
}
sprintf(lpData,m_strSource);//m_strSource為CString 字串 eg:m_strSource="hello world"
UnmapViewOfFile(lpData);
//**************************************************************************************************************
在另一個程序Ceiver中共享“MyShare”記憶體區域;
HANDLE hMapping ;
LPSTR lpData;
hMapping=CreateFileMapping(HANDLE(0xFFFFFFFF),NULL,PAGE_READWRITE,0,0x100,"MyShare");
if(hMapping==NULL)
{
MessageBox("CreateFileMapping failed");
return ;
}
lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpData==NULL)
{
MessageBox("MapViewOfFile failed");
return ;
}
m_strSource.Format(lpData);m_strSource為CString 變數
UnmapViewOfFile(lpData);
MessageBox(m_strSource);
至此 ,Ceiver就可以共享Server程序共享得記憶體啦;
NOTE:呼叫CreateFileMapping的時候GetLastError的對應錯誤
ERROR_FILE_INVALID如果企圖建立一個零長度的檔案對映, 應有此報
ERROR_INVALID_HANDLE如果發現你的命名記憶體空間和現有的記憶體對映, 互斥量, 訊號量, 臨界區同名就麻煩
了
ERROR_ALREADY_EXISTS表示記憶體空間命名已經存在