进程间通信——共享内存

举报
AI浩 发表于 2021/12/22 23:12:51 2021/12/22
1.3k+ 0 0
【摘要】 接收端 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Runtime.InteropSer...

接收端


      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Runtime.InteropServices;
      using System.Text;
      using System.Threading;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      namespace WindowsFormsApp1
      {
         public partial class Form1 : Form
          {
             const int INVALID_HANDLE_VALUE = -1;
             const int PAGE_READWRITE = 0x04;
              [DllImport("User32.dll")]
             private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
              [DllImport("User32.dll")]
             private static extern bool SetForegroundWindow(IntPtr hWnd);
             //共享内存
              [DllImport("Kernel32.dll", EntryPoint = "CreateFileMapping")]
             private static extern IntPtr CreateFileMapping(IntPtr hFile, //HANDLE hFile,
       UInt32 lpAttributes,//LPSECURITY_ATTRIBUTES lpAttributes, //0
       UInt32 flProtect,//DWORD flProtect
       UInt32 dwMaximumSizeHigh,//DWORD dwMaximumSizeHigh,
       UInt32 dwMaximumSizeLow,//DWORD dwMaximumSizeLow,
       string lpName//LPCTSTR lpName
       );
              [DllImport("Kernel32.dll", EntryPoint = "OpenFileMapping")]
             private static extern IntPtr OpenFileMapping(
               UInt32 dwDesiredAccess,//DWORD dwDesiredAccess,
              int bInheritHandle,//BOOL bInheritHandle,
              string lpName//LPCTSTR lpName
               );
             const int FILE_MAP_ALL_ACCESS = 0x0002;
             const int FILE_MAP_WRITE = 0x0002;
              [DllImport("Kernel32.dll", EntryPoint = "MapViewOfFile")]
             private static extern IntPtr MapViewOfFile(
       IntPtr hFileMappingObject,//HANDLE hFileMappingObject,
       UInt32 dwDesiredAccess,//DWORD dwDesiredAccess
       UInt32 dwFileOffsetHight,//DWORD dwFileOffsetHigh,
       UInt32 dwFileOffsetLow,//DWORD dwFileOffsetLow,
       UInt32 dwNumberOfBytesToMap//SIZE_T dwNumberOfBytesToMap
       );
              [DllImport("Kernel32.dll", EntryPoint = "UnmapViewOfFile")]
             private static extern int UnmapViewOfFile(IntPtr lpBaseAddress);
              [DllImport("Kernel32.dll", EntryPoint = "CloseHandle")]
             private static extern int CloseHandle(IntPtr hObject);
             private Semaphore m_Write;  //可写的信号
             private Semaphore m_Read;  //可读的信号
             private IntPtr handle;     //文件句柄
             private IntPtr addr;       //共享内存地址
             uint mapLength;            //共享内存长
             //线程用来读取数据
              Thread threadRed;
             public Form1()
              {
                  InitializeComponent();
                 init();
              }
             ///<summary>/// 初始化共享内存数据 创建一个共享内存
             ///</summary>
             private void init()
              {
                  m_Write = new Semaphore(1, 1, "WriteMap");//开始的时候有一个可以写
                  m_Read = new Semaphore(0, 1, "ReadMap");//没有数据可读
                  mapLength = 1024;
                  IntPtr hFile = new IntPtr(INVALID_HANDLE_VALUE);
                  handle = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, mapLength, "shareMemory");
                  addr = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
                  threadRed = new Thread(new ThreadStart(ThreadReceive));
                  threadRed.Start();
              }
             /// <summary>
             /// 线程启动从共享内存中获取数据信息 
             /// </summary>
             private void ThreadReceive()
              {
                 while (true)
                  {
                     try
                      {
                         //读取共享内存中的数据:
                         //是否有数据写过来
                          m_Read.WaitOne();
                         //IntPtr m_Sender = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
                         byte[] byteStr = new byte[100];
                          byteCopy(byteStr, addr);
                         string str = Encoding.Default.GetString(byteStr, 0, byteStr.Length);
                         this.Invoke((MethodInvoker)(delegate ()
                          { textBox1.Text = str.Trim(); })
                              );
                          /调用数据处理方法 处理读取到的数据
                          m_Write.Release();
                      }
                     catch (WaitHandleCannotBeOpenedException)
                      {
                         continue;
                         //Thread.Sleep(0);
                      }
                  }
              }
             //不安全的代码在项目生成的选项中选中允许不安全代码
             static unsafe void byteCopy(byte[] dst, IntPtr src)
              {
                 fixed (byte* pDst = dst)
                  {
                     byte* pdst = pDst;
                     byte* psrc = (byte*)src;
                     while ((*pdst++ = *psrc++) != '\0')
                          ;
                  }
              }
          }
      }
  
 

发送端


      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Runtime.InteropServices;
      using System.Text;
      using System.Threading;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      namespace WindowsFormsApp2
      {
         public partial class Form1 : Form
          {
             const int INVALID_HANDLE_VALUE = -1;
             const int PAGE_READWRITE = 0x04;
             //共享内存
              [DllImport("Kernel32.dll", EntryPoint = "CreateFileMapping")]
             private static extern IntPtr CreateFileMapping(IntPtr hFile, //HANDLE hFile,
       UInt32 lpAttributes,//LPSECURITY_ATTRIBUTES lpAttributes, //0
       UInt32 flProtect,//DWORD flProtect
       UInt32 dwMaximumSizeHigh,//DWORD dwMaximumSizeHigh,
       UInt32 dwMaximumSizeLow,//DWORD dwMaximumSizeLow,
       string lpName//LPCTSTR lpName
       );
              [DllImport("Kernel32.dll", EntryPoint = "OpenFileMapping")]
             private static extern IntPtr OpenFileMapping(
               UInt32 dwDesiredAccess,//DWORD dwDesiredAccess,
              int bInheritHandle,//BOOL bInheritHandle,
              string lpName//LPCTSTR lpName
               );
             const int FILE_MAP_ALL_ACCESS = 0x0002;
             const int FILE_MAP_WRITE = 0x0002;
              [DllImport("Kernel32.dll", EntryPoint = "MapViewOfFile")]
             private static extern IntPtr MapViewOfFile(
       IntPtr hFileMappingObject,//HANDLE hFileMappingObject,
       UInt32 dwDesiredAccess,//DWORD dwDesiredAccess
       UInt32 dwFileOffsetHight,//DWORD dwFileOffsetHigh,
       UInt32 dwFileOffsetLow,//DWORD dwFileOffsetLow,
       UInt32 dwNumberOfBytesToMap//SIZE_T dwNumberOfBytesToMap
       );
              [DllImport("Kernel32.dll", EntryPoint = "UnmapViewOfFile")]
             private static extern int UnmapViewOfFile(IntPtr lpBaseAddress);
              [DllImport("Kernel32.dll", EntryPoint = "CloseHandle")]
             private static extern int CloseHandle(IntPtr hObject);
             private Semaphore m_Write;  //可写的信号
             private Semaphore m_Read;  //可读的信号
             private IntPtr handle;     //文件句柄
             private IntPtr addr;       //共享内存地址
             uint mapLength;            //共享内存长
              Thread threadRed;
             public Form1()
              {
                  InitializeComponent();
                 //threadRed = new Thread(new ThreadStart(init));
                 //threadRed.Start();
                  mapLength = 1024;
              }
             private void button1_Click(object sender, EventArgs e)
              {
                 try
                  {
                      m_Write = Semaphore.OpenExisting("WriteMap");
                      m_Read = Semaphore.OpenExisting("ReadMap");
                      handle = OpenFileMapping(FILE_MAP_WRITE, 0, "shareMemory");
                      addr = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
                      m_Write.WaitOne();
                     byte[] sendStr = Encoding.Default.GetBytes(textBox1.Text.ToString() + '\0');
                     //如果要是超长的话,应另外处理,最好是分配足够的内存
                     if (sendStr.Length < mapLength)
                          Copy(sendStr, addr);
                      m_Read.Release();
                  }
                 catch (WaitHandleCannotBeOpenedException)
                  {
                      MessageBox.Show("不存在系统信号量!");
                     return;
                  }
              }
             static unsafe void Copy(byte[] byteSrc, IntPtr dst)
              {
                 fixed (byte* pSrc = byteSrc)
                  {
                     byte* pDst = (byte*)dst;
                     byte* psrc = pSrc;
                     for (int i = 0; i < byteSrc.Length; i++)
                      {
                          *pDst = *psrc;
                          pDst++;
                          psrc++;
                      }
                  }
              }
          }
      }
  
 

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/112003475

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。