C++使用共享內存實現進程間通信文件映射是一種實現進程間單向或雙向通信的機制。它允許兩個或多個本地進程間相互通信。為了共享文件或內存,所有的進程必須使用相同的文件映射的名字或是句柄。為了實現共享文件,第一個進程先調用CreateFile方法。接下來調用CreateFileMapping方法來創建一個文件映射對象。并為文件映射指明一個句柄和名稱。由于事件,信號,互斥對象和文件映射等這些內核對象都共享同一個名字空間,所以如果這個名字和其他一個對象的名稱重名的話那么將創建失敗。為了實現共享內存,進程應首先調用CreateFileMapping函數然后在hFile參數中傳入INVALID_HANDLE_VALUE宏來替代句柄。相應的文件映射對象會從系統的分頁文件中獲得一段內存。如果hFile參數的值是INVALID_HANDLE_VALUE,那么你在調用CreateFileMapping時必須給共享內存指定一個大小值。使用共享內存或文件的進程必須使用MapViewOfFile函數或MapViewOfFileEx函數來創建一個文件視圖。示例代碼:服務端:HANDLE hfilemapping = NULL;
void CCSharedMemoryDlg::OnButton1()
{
// TODO: Add your control notification handler code here
hfilemapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 16, "COMBANC_SHARE");
//創建錯誤
if ((hfilemapping == NULL) || (hfilemapping == INVALID_HANDLE_VALUE))
// return lx_invalid_sharedmemory;
MessageBox("error");
//共享內存已經存在
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox("共享內存已經存在");
return;
}
BYTE *psize = (BYTE *)MapViewOfFile(hfilemapping, FILE_MAP_WRITE, 0, 0, sizeof(BYTE));
if(psize == NULL)
{
if (hfilemapping != NULL)
{
CloseHandle(hfilemapping);
hfilemapping = NULL;
}
return;
}
CString sTest = "abc";
char ch[16] = "COMBANC_TEST";
memcpy(psize,sTest,sTest.GetLength());
if (psize != NULL)
{
UnmapViewOfFile(psize );
psize = NULL;
}
}
客戶端:HANDLE hfilemapping = NULL;
void CTestShareMemoryDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
hfilemapping = OpenFileMapping(FILE_MAP_READ, FALSE, "COMBANC_SHARE");
if ((hfilemapping == NULL) || (hfilemapping == INVALID_HANDLE_VALUE))
MessageBox("error");
BYTE *psize = (BYTE *)MapViewOfFile(hfilemapping, FILE_MAP_READ, 0, 0, sizeof(BYTE));
if(psize == NULL)
{
if (hfilemapping != NULL)
{
CloseHandle(hfilemapping);
hfilemapping = NULL;
}
return;
}
char ch[16];
memcpy(ch,psize,16);
MessageBox(ch);
if (psize != NULL)
{
UnmapViewOfFile(psize );
psize = NULL;
}
if (hfilemapping != NULL)
{
CloseHandle(hfilemapping);
hfilemapping = NULL;
}
}
posted on 2014-04-11 18:37
王海光 閱讀(602)
評論(0) 編輯 收藏 引用 所屬分類:
C++