共享内存程序配置文件 c#

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace JZLMonitor_V2._0

    public class ShareMem 
    { 
        [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 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;
        const int INVALID_HANDLE_VALUE = -1; 
        IntPtr m_hSharedMemoryFile = IntPtr.Zero;
        IntPtr m_pwData = IntPtr.Zero;
        bool m_bAlreadyExist = false;
        bool m_bInit = false;
        long m_MemSize=0;
        public ShareMem() 
        { 
        }
        ~ShareMem()
        { 
            Close(); 
        } 
        /// ﹤summary﹥
        ///
        /// 初始化共享内存 
        /// ﹤/summary﹥ 
        /// ﹤param name="strName"﹥共享内存名称﹤/param﹥ 
        /// ﹤param name="lngSize"﹥共享内存大小﹤/param﹥
        /// ﹤returns﹥﹤/returns﹥
        public int Init(string strName, long lngSize) 
        {
            if (lngSize <= 0 || lngSize > 0x00800000)
            {
                lngSize = 0x00800000;
            }
            m_MemSize = lngSize; 
           
            if (strName.Length > 0) 
            { 
                //创建内存共享体(INVALID_HANDLE_VALUE)
                m_hSharedMemoryFile = CreateFileMapping(  INVALID_HANDLE_VALUE, IntPtr.Zero,   (uint)PAGE_READWRITE, 0, (uint)lngSize, strName);
                if (m_hSharedMemoryFile == 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 = MapViewOfFile(m_hSharedMemoryFile,   FILE_MAP_WRITE, 0, 0, (uint)lngSize); 
                if (m_pwData == IntPtr.Zero) 
                { 
                    m_bInit = false;
                    CloseHandle(m_hSharedMemoryFile); 
                    return 3; //创建内存映射失败
                } 
                else
                {
                    m_bInit = true;
                    if (m_bAlreadyExist == false) 
                    { 
                        //初始化 
                    } 
                }  //---------------------------------------- 
            }
            else
            { 
                return 1; //参数错误  
            }  
            return 0; //创建成功 
        } 
        /// ﹤summary﹥ 
        /// 关闭共享内存
        /// ﹤/summary﹥
        public void Close() 
        { 
            if (m_bInit)
            { 
                UnmapViewOfFile(m_pwData);
                CloseHandle(m_hSharedMemoryFile);
            } 
        }  
        /// ﹤summary﹥
        /// 读数据
        /// ﹤/summary﹥
        /// ﹤param name="bytData"﹥数据﹤/param﹥ 
        /// ﹤param name="lngAddr"﹥起始地址﹤/param﹥ 
        /// ﹤param name="lngSize"﹥个数﹤/param﹥
        /// ﹤returns﹥﹤/returns﹥
        public int Read(ref byte[] bytData,   int lngAddr, int lngSize)
        {
            if (lngAddr + lngSize > m_MemSize)
            return 2;   //超出数据区
            if (m_bInit) 
            {   
                Marshal.Copy(m_pwData, 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(byte[] bytData, int lngAddr, int lngSize) 
        {
            if (lngAddr + lngSize > m_MemSize)
            return 2; //超出数据区 
            if (m_bInit)
            {
                Marshal.Copy(bytData, lngAddr, m_pwData, lngSize);
            }
            else
            {
                return 1; //共享内存未初始化
            } 
            return 0; //写成功
        } 
    } 
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值