VC 进程间通信 共享内存

   进程通常被定义为一个正在运行的程序的实例, 为了能在两个进程之间进行通讯,我们可以通过下面的方法来实现:

2。使用共享内存方式(Shared Memory)

 a.设定一块共享内存区域          

     HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD,  LPCSTR)

     产生一个file-mapping核心对象

     LPVOID MapViewOfFile(

         HANDLE hFileMappingObject,

         DWORD  dwDesiredAcess,

         DWORD  dwFileOffsetHigh,

         DWORD  dwFileOffsetLow,

         DWORD  dwNumberOfBytesToMap

     );

    得到共享内存的指针

   b.找出共享内存

    决定这块内存要以点对点(peer to peer)的形式呈现

        每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程

        都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的

        错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己 排在第 一位,并接下来将共享内存初始化。

    还是要使用client/server架构中

       只有server进程才应该产生并初始化共享内存。所有的进程都应该使用

HANDLE OpenFileMapping(DWORD dwDesiredAccess,

                                   BOOL bInheritHandle,

                                   LPCTSTR lpName);

        再调用MapViewOfFile(),取得共享内存的指针

   c.同步处理(Mutex)

   d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);

                        CloseHandle()

这个创建内存共享我觉得是最简单的方法:

代码实现

 

//共内存句柄
HANDLE m_hwdShareMemery;
//共享内存映射
char* m_strBufStart;
void OnBnClickedBtnCreate()
{
	m_hwdShareMemery = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 2048, _T("TestMem"));
	if (m_hwdShareMemery == NULL)
	{
		AfxMessageBox(_T("Create Share Memery Failed !"));
	}
	
}


void OnBnClickedBtnMap()
{
	HANDLE handleFile = NULL;
	handleFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, _T("TestMem"));
	m_strBufStart = (char*)MapViewOfFile(handleFile, FILE_MAP_ALL_ACCESS, 0, 0, 2048);
}


void OnBnClickedBtnWrite()
{
	CString str;
	m_edtWrite.GetWindowTextW(str);
	int nStrLen = str.GetLength();
	sprintf_s(m_strBufStart,nStrLen*2, "%S", str);
	m_edtWrite.SetWindowTextW(_T(""));
}


void OnBnClickedBtnRead()
{
	CString strRead(m_strBufStart);
	m_edtRead.SetWindowTextW(strRead);
}

你可能感兴趣的:(VC,共享内存,进程间通信)