1. 程式人生 > >通過記憶體對映實現程序間資料交換

通過記憶體對映實現程序間資料交換

程序間通訊有好幾种放發,其中共享記憶體可以實現大量快速得資料交換,
現簡單介紹下這種方法得基本原理

所用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表示記憶體空間命名已經存在