windows 进程间通信(共享内存)

进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:

       一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方

      另一个是地址空间,它包含所有的可执行模块或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"); //写入数据到文件中

在另一个进程中打开共享文件并访问数据


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值