lqc 自用 共享内存

  class Sharedmm
  {
      [DllImport("user32.dll", CharSet = CharSet.Auto)]
      public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);

      [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
      public static extern IntPtr CreateFileMapping(int hFile, IntPtr lpAttributes, uint flProtect, uint dwMaxSizeHi, uint dwMaxSizeLow, string lpName);

      [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
      public static extern IntPtr OpenFileMapping(int dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, string lpName);

      [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
      public static extern IntPtr MapViewOfFile(IntPtr hFileMapping, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, uint dwNumberOfBytesToMap);

      [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
      public static extern bool UnmapViewOfFile(IntPtr pvBaseAddress);

      [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
      public static extern bool CloseHandle(IntPtr handle);

      [DllImport("kernel32", EntryPoint = "GetLastError")]
      public static extern int GetLastError();

      const int ERROR_ALREADY_EXISTS = 183;

      const int INVALID_HANDLE_VALUE = -1;


      const int FILE_MAP_COPY = 0x0001;
      const int FILE_MAP_WRITE = 0x0002;
      const int FILE_MAP_READ = 0x0004;
      const int FILE_MAP_ALL_ACCESS = 0x0002 | 0x0004;

      const int PAGE_READONLY = 0x02;
      const int PAGE_READWRITE = 0x04;
      const int PAGE_WRITECOPY = 0x08;
      const int PAGE_EXECUTE = 0x10;
      const int PAGE_EXECUTE_READ = 0x20;
      const int PAGE_EXECUTE_READWRITE = 0x40;

      const int SEC_COMMIT = 0x8000000;
      const int SEC_IMAGE = 0x1000000;
      const int SEC_NOCACHE = 0x10000000;
      const int SEC_RESERVE = 0x4000000;

      IntPtr[] m_hSharedMemoryFile;
      IntPtr[] m_pwData;
      bool m_bAlreadyExist = false;
      bool m_bInit = false;
      long m_MemSize = 0;


      private Semaphore m_Write;   //可写的信号
      private Semaphore m_Read;   //可读的信号
      int m_number;
      public Sharedmm(int number)
      {
          m_number = number;
        m_hSharedMemoryFile = new IntPtr[m_number];
          m_pwData = new IntPtr[m_number];
          m_Write = new Semaphore(1, 1);
        //  m_Read = new Semaphore(0, 1);
          for (int i = 0; i < m_number; i++)
          {
              Init("eeee"+i.ToString(), i);
          }
      }
      ~Sharedmm()
      {
          Close();
      }

      /// <summary>
      /// 初始化共享内存
      /// </summary>
      /// <param name="strName">共享内存名称</param>
      /// <param name="lngSize">共享内存大小</param>
      /// <returns></returns>
      public int Init(string strName, int number, long lngSize = 512)
      {
          if (lngSize <= 0 || lngSize > 0x00800000) lngSize = 0x00800000;
          m_MemSize = lngSize+2;
          if (strName.Length > 0)
          {
              //创建内存共享体(INVALID_HANDLE_VALUE)
              m_hSharedMemoryFile[number] = CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, (uint)PAGE_READWRITE, 0, (uint)lngSize, strName);
              if (m_hSharedMemoryFile[number] == IntPtr.Zero)
              {
                  m_bAlreadyExist = false;
                  m_bInit = false;
                  return 2; //创建共享体失败
              }
              else
              {
                  if (GetLastError() == ERROR_ALREADY_EXISTS)  //已经创建
                  {
                      m_bAlreadyExist = true;
                  }
                  else                                         //新创建
                  {
                      m_bAlreadyExist = false;
                  }
              }
              //---------------------------------------
              //创建内存映射
              m_pwData[number] = MapViewOfFile(m_hSharedMemoryFile[number], FILE_MAP_WRITE, 0, 0, (uint)lngSize);
              if (m_pwData[number] == IntPtr.Zero)
              {
                  m_bInit = false;
                  CloseHandle(m_hSharedMemoryFile[number]);
                  return 3; //创建内存映射失败
              }
              else
              {
                  m_bInit = true;
                  if (m_bAlreadyExist == false)
                  {
                      //初始化
                  }
              }
              //----------------------------------------
          }
          else
          {
              return 1; //参数错误    
          }

          return 0;     //创建成功
      }
      /// <summary>
      /// 关闭共享内存
      /// </summary>
      public void Close()
      {
          if (m_bInit)
          {
              for (int i = 0; i < m_number; i++)
              {

                  UnmapViewOfFile(m_pwData[i]);
                  CloseHandle(m_hSharedMemoryFile[i]);
              }
          }
      }

      /// <summary>
      /// 读数据
      /// </summary>
      /// <param name="bytData">数据</param>
      /// <param name="lngAddr">起始地址</param>
      /// <param name="lngSize">个数</param>
      /// <returns></returns>
      public int Read(ref byte[] bytData, int lngAddr=0, int lngSize=512)
      {
          if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区
          if (m_bInit)
          {
              Marshal.Copy(m_pwData[m_number], bytData, lngAddr, lngSize);
          }
          else
          {
              return 1; //共享内存未初始化
          }
          return 0;     //读成功
      }

      /// <summary>
      /// 写数据
      /// </summary>
      /// <param name="bytData">数据</param>
      /// <param name="lngAddr">起始地址</param>
      /// <param name="lngSize">个数</param>
      /// <returns></returns>
      public int Write(int number, byte[] bytData,int lngAddr=0, int lngSize=512)
      {
          m_Write.WaitOne();
          if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区
          if (m_bInit)
          {
              Marshal.Copy(bytData, lngAddr, m_pwData[number], lngSize);
          }
          else
          {
              return 1; //共享内存未初始化
          }
          return 0;     //写成功
      }

      /// <summary>
      /// 读数据
      /// </summary>
      /// <param name="bytData">数据</param>
      /// <param name="lngAddr">起始地址</param>
      /// <param name="lngSize">个数</param>
      /// <returns></returns>
      public int Read(int num,ref string x, int lngAddr=0, int lngSize=512)
      {
          byte[] bytData = new byte[512];
          if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区
          if (m_bInit)
          {
              Marshal.Copy(m_pwData[num], bytData, lngAddr, bytData.Length);
              x = Encoding.UTF8.GetString(bytData);
          }
          else
          {
              return 1; //共享内存未初始化
          }
          return 0;     //读成功
      }

      /// <summary>
      /// 写数据
      /// </summary>
      /// <param name="bytData">数据</param>
      /// <param name="lngAddr">起始地址</param>
      /// <param name="lngSize">个数</param>
      /// <returns></returns>
      public int Write(int number, string x, int lngAddr=0, int lngSize=512)
      {
         m_Write.WaitOne();
          //  byte[] bytData = new byte[514];
          byte[] bytData = Encoding.UTF8.GetBytes(x);
          if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区
          if (m_bInit)
          {
              // Marshal.Copy(bytData, lngAddr, m_pwData[number], lngSize+2);
              Marshal.Copy(bytData, lngAddr, m_pwData[number], bytData.Length);
              x = Encoding.UTF8.GetString(bytData);
          }
          else
          {
              return 1; //共享内存未初始化
          }
          return 0;     //写成功
      }


  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值