共享内存方式(SharedMemory)

 

 
 
共享内存方式(SharedMemory)

内存映射一般是做进程间通讯的,线程间通信有太多方法了。
a.设定一块共享内存区域,得到共享内存的指针

HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR) 
	LPVOIDMapViewOfFile(
	HANDLEhFileMappingObject,
	DWORDdwDesiredAcess,
	DWORDdwFileOffsetHigh,
	DWORDdwFileOffsetLow,
	DWORDdwNumberOfBytesToMap
);
  
b.找出共享内存
 决定这块内存要以点对点(peertopeer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。
  每个进程都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的错误代码是ERROR_ALREADY_EXISTS,
  那么进程就可以假设这一共享内存区域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己排在第一位,并接下来将共享内存初始化。
 还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。所有的进程都应该使用

HANDLE OpenFileMapping( DWORDdwDesiredAccess,BOOLbInheritHandle,LPCTSTRlpName );
  
  再调用MapViewOfFile(),取得共享内存的指针
c.同步处理(Mutex)
d.清理(Cleaningup)

BOOL UnmapViewOfFile( LPCVOIDlpBaseAddress );

CloseHandle();


内存映射文件方法
1、 服务器端代码:
//0xFFFFFFFF表示创建一个进程间共享的对象
HANDLE hMapFile = CreateFileMapping( (HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, MemorySize, "SharedMemory1" );
if( hMapFile == NULL )
{
	AfxMessageBox("Create SharedMemory 出错");
	return;
}
//如果函数返回成功,返回值为文件对象句柄;
//如果这个SharedMemory1已经存在,函数返回这个存在的句柄(大小为现在的大小),GetLastError函数会返回 ERROR_ALREADY_EXISTS。


LPVOID pFile;
pFile= MapViewOfFile(hMapFile,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);
if (pFile == NULL)
{
	AfxMessageBox("MapViewOfFile出错!");
	return;
}
CString str;
GetDlgItemText(IDC_EDIT1,str);
strcpy((char*)pFile,str.GetBuffer(str.GetLength()));
//CloseHandle(hMapFile); //不能加,否则客户端收不到,所以一般会将这个句柄作为一个全局变量
2、 客户机端代码:
HANDLE hMap;
hMap= OpenFileMapping( FILE_MAP_READ|FILE_MAP_WRITE,
											 TRUE,
											 "SharedMemory1"
											);
LPVOID pVoid;
pVoid=::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
CString str=(char*)pVoid;
SetDlgItemText(IDC_EDIT1,str);
UnmapViewOfFile(pVoid);
CloseHandle(hMap);

你可能感兴趣的:(VC)