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()

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

代码实现

在一个进程中创建共享文件

  1.           HANDLE lhShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,"penghao");  
  2. if (lhShareMemory !=NULL)  
  3. {  
  4.     //AfxMessageBox("共享数据打开成功!");   
  5. }  
  6.   
  7. char * strBuffer;  
  8. strBuffer = (char * ) MapViewOfFile(lhShareMemory,FILE_MAP_WRITE,0,0,1024);//获取文件地址   
  9. 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"); //写入数据到文件中

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

  1.     ShellExecute(NULL,"open","processMfc.exe",0,0,SW_SHOW); //加载创建共享文件的进程   
  2.     HANDLE  handleFile;  
  3.     handleFile= OpenFileMapping(FILE_MAP_ALL_ACCESS,false,"penghao"); //打开共享文件   
  4.     if (handleFile!=NULL)  
  5.     {  
  6.         AfxMessageBox("共享数据打开成功");  
  7.     }  
  8.      char * str = NULL;  
  9.     str=(char *) MapViewOfFile(handleFile,FILE_MAP_ALL_ACCESS,0,0,1024);//获取共享文件地址,并获取数据   
  10.   
  11.     if (StrCmp(str,"update")==0)  
  12.     {  
  13.         AfxMessageBox(str);  
  14.     }  
  15.       
  16.     UnmapViewOfFile(str);  
  17.     CloseHandle(handleFile);  
  18.   
  19.   
  20.     return TRUE;  // return TRUE  unless you set the focus to a control   
  21. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值