一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方
另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于其它进程的内存则是隐藏的,并不能被正在运行的线程访问。
为了能在两个进程之间进行通讯,我们可以通过下面的方法来实现:
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 lhShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,"penghao");
- if (lhShareMemory !=NULL)
- {
- //AfxMessageBox("共享数据打开成功!");
- }
- char * strBuffer;
- strBuffer = (char * ) MapViewOfFile(lhShareMemory,FILE_MAP_WRITE,0,0,1024);//获取文件地址
- strcpy(strBuffer,"update"); //写入数据到文件中
HANDLE lhShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,"penghao");
if (lhShareMemory !=NULL)
{
//AfxMessageBox("共享数据打开成功!");
}
char * strBuffer;
strBuffer = (char * ) MapViewOfFile(lhShareMemory,FILE_MAP_WRITE,0,0,1024);//获取文件地址
strcpy(strBuffer,"update"); //写入数据到文件中
在另一个进程中打开共享文件并访问数据
- ShellExecute(NULL,"open","processMfc.exe",0,0,SW_SHOW); //加载创建共享文件的进程
- HANDLE handleFile;
- handleFile= OpenFileMapping(FILE_MAP_ALL_ACCESS,false,"penghao"); //打开共享文件
- if (handleFile!=NULL)
- {
- AfxMessageBox("共享数据打开成功");
- }
- char * str = NULL;
- str=(char *) MapViewOfFile(handleFile,FILE_MAP_ALL_ACCESS,0,0,1024);//获取共享文件地址,并获取数据
- if (StrCmp(str,"update")==0)
- {
- AfxMessageBox(str);
- }
- UnmapViewOfFile(str);
- CloseHandle(handleFile);
- return TRUE; // return TRUE unless you set the focus to a control
- }