共享内存操作类(C#源码)

VC++的共享内存操作代码实现起来相对比较容易,但是用C#语言来实现,就有一定难度,由于工作需要,把以前VC开发的共享内存代码要用C#实现,别说,还费了不少周折,毕竟C#操作API函数和地址指针不是那么直接,还好,总算完成了,效果还不错。

    

共享内存操作类:    

 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Runtime.InteropServices;  
  5.  
  6. namespace ShareMemLib  
  7. {  
  8.     public class ShareMem  
  9.     {  
  10.         [DllImport("user32.dll", CharSet = CharSet.Auto)]  
  11.         public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);  
  12.  
  13.         [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  14.         public static extern IntPtr CreateFileMapping(int hFile, IntPtr lpAttributes, uint flProtect, uint dwMaxSizeHi, uint dwMaxSizeLow, string lpName);  
  15.           
  16.         [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  17.         public static extern IntPtr OpenFileMapping(int dwDesiredAccess,[MarshalAs(UnmanagedType.Bool)] bool bInheritHandle,string lpName);  
  18.  
  19.         [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  20.         public static extern IntPtr MapViewOfFile(IntPtr hFileMapping,uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow,uint dwNumberOfBytesToMap);  
  21.  
  22.         [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  23.         public static extern bool UnmapViewOfFile(IntPtr pvBaseAddress);  
  24.  
  25.         [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  26.         public static extern bool CloseHandle(IntPtr handle);  
  27.  
  28.         [DllImport("kernel32", EntryPoint="GetLastError")]  
  29.         public static extern int GetLastError ();  
  30.  
  31.         const int ERROR_ALREADY_EXISTS = 183;  
  32.  
  33.         const int FILE_MAP_COPY = 0x0001;  
  34.         const int FILE_MAP_WRITE = 0x0002;  
  35.         const int FILE_MAP_READ = 0x0004;  
  36.         const int FILE_MAP_ALL_ACCESS = 0x0002 | 0x0004;  
  37.  
  38.         const int PAGE_READONLY = 0x02;  
  39.         const int PAGE_READWRITE = 0x04;  
  40.         const int PAGE_WRITECOPY = 0x08;  
  41.         const int PAGE_EXECUTE = 0x10;  
  42.         const int PAGE_EXECUTE_READ = 0x20;  
  43.         const int PAGE_EXECUTE_READWRITE = 0x40;  
  44.  
  45.         const int SEC_COMMIT = 0x8000000;  
  46.         const int SEC_IMAGE = 0x1000000;  
  47.         const int SEC_NOCACHE = 0x10000000;  
  48.         const int SEC_RESERVE = 0x4000000;  
  49.  
  50.         const int INVALID_HANDLE_VALUE = -1;  
  51.  
  52.         IntPtr m_hSharedMemoryFile = IntPtr.Zero;  
  53.         IntPtr m_pwData = IntPtr.Zero;  
  54.         bool m_bAlreadyExist = false;  
  55.         bool m_bInit = false;  
  56.         long m_MemSize=0;  
  57.  
  58.         public ShareMem()  
  59.         {  
  60.         }  
  61.         ~ShareMem()  
  62.         {  
  63.             Close();  
  64.         }  
  65.  
  66.         /// <summary>  
  67.         /// 初始化共享内存  
  68.         /// </summary>  
  69.         /// <param name="strName">共享内存名称</param>  
  70.         /// <param name="lngSize">共享内存大小</param>  
  71.         /// <returns></returns>  
  72.         public int Init(string strName, long lngSize)  
  73.         {  
  74.             if (lngSize <= 0 || lngSize > 0x00800000) lngSize = 0x00800000;  
  75.             m_MemSize = lngSize;  
  76.             if (strName.Length > 0)  
  77.             {  
  78.                 //创建内存共享体(INVALID_HANDLE_VALUE)  
  79.                 m_hSharedMemoryFile = CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, (uint)PAGE_READWRITE, 0, (uint)lngSize, strName);  
  80.                 if (m_hSharedMemoryFile == IntPtr.Zero)  
  81.                 {  
  82.                     m_bAlreadyExist = false;  
  83.                     m_bInit = false;  
  84.                     return 2; //创建共享体失败  
  85.                 }  
  86.                 else 
  87.                 {  
  88.                     if (GetLastError() == ERROR_ALREADY_EXISTS)  //已经创建  
  89.                     {  
  90.                         m_bAlreadyExist = true;  
  91.                     }  
  92.                     else                                         //新创建  
  93.                     {  
  94.                         m_bAlreadyExist = false;  
  95.                     }  
  96.                 }  
  97.                 //---------------------------------------  
  98.                 //创建内存映射  
  99.                 m_pwData = MapViewOfFile(m_hSharedMemoryFile, FILE_MAP_WRITE, 0, 0, (uint)lngSize);  
  100.                 if (m_pwData == IntPtr.Zero)  
  101.                 {  
  102.                     m_bInit = false;  
  103.                     CloseHandle(m_hSharedMemoryFile);  
  104.                     return 3; //创建内存映射失败  
  105.                 }  
  106.                 else 
  107.                 {  
  108.                     m_bInit = true;  
  109.                     if (m_bAlreadyExist == false)  
  110.                     {  
  111.                         //初始化  
  112.                     }  
  113.                 }  
  114.                 //----------------------------------------  
  115.             }  
  116.             else 
  117.             {  
  118.                 return 1; //参数错误       
  119.             }  
  120.  
  121.             return 0;     //创建成功  
  122.         }  
  123.         /// <summary>  
  124.         /// 关闭共享内存  
  125.         /// </summary>  
  126.         public void Close()  
  127.         {  
  128.             if (m_bInit)  
  129.             {  
  130.                 UnmapViewOfFile(m_pwData);  
  131.                 CloseHandle(m_hSharedMemoryFile);  
  132.             }  
  133.         }  
  134.  
  135.         /// <summary>  
  136.         /// 读数据  
  137.         /// </summary>  
  138.         /// <param name="bytData">数据</param>  
  139.         /// <param name="lngAddr">起始地址</param>  
  140.         /// <param name="lngSize">个数</param>  
  141.         /// <returns></returns>  
  142.         public int Read(ref byte[] bytData, int lngAddr, int lngSize)  
  143.         {  
  144.             if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区  
  145.             if (m_bInit)  
  146.             {                 
  147.                 Marshal.Copy(m_pwData, bytData, lngAddr, lngSize);  
  148.             }  
  149.             else 
  150.             {  
  151.                 return 1; //共享内存未初始化  
  152.             }  
  153.             return 0;     //读成功  
  154.         }  
  155.  
  156.         /// <summary>  
  157.         /// 写数据  
  158.         /// </summary>  
  159.         /// <param name="bytData">数据</param>  
  160.         /// <param name="lngAddr">起始地址</param>  
  161.         /// <param name="lngSize">个数</param>  
  162.         /// <returns></returns>  
  163.         public int Write(byte[] bytData, int lngAddr, int lngSize)  
  164.         {  
  165.             if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区  
  166.             if (m_bInit)  
  167.             {  
  168.                 Marshal.Copy(bytData, lngAddr, m_pwData, lngSize);  
  169.             }  
  170.             else 
  171.             {  
  172.                 return 1; //共享内存未初始化  
  173.             }  
  174.             return 0;     //写成功  
  175.         }  
  176.     }  
  177. }  
  178.  
  179. 测试例程:   
  180.  
  181. using System;  
  182. using System.Collections.Generic;  
  183. using System.ComponentModel;  
  184. using System.Data;  
  185. using System.Drawing;  
  186. using System.Text;  
  187. using System.Windows.Forms;  
  188. using ShareMemLib;  
  189.  
  190. namespace YFShareMem  
  191. {  
  192.     public partial class frmShareMem : Form  
  193.     {  
  194.         ShareMem MemDB=new ShareMem();  
  195.         public frmShareMem()  
  196.         {  
  197.             InitializeComponent();  
  198.         }  
  199.  
  200.         private void btnOpen_Click(object sender, EventArgs e)  
  201.         {  
  202.             if (MemDB.Init("YFMemTest", 10240) != 0)  
  203.             {  
  204.                 //初始化失败  
  205.                 MessageBox.Show("初始化失败");  
  206.             }  
  207.             else 
  208.             {  
  209.                 btnOpen.Enabled = false;  
  210.                 chkWrite.Enabled = true;  
  211.                 tmrTime.Enabled = true;  
  212.             }  
  213.         }  
  214.  
  215.         private void tmrTime_Tick(object sender, EventArgs e)  
  216.         {  
  217.             byte[] bytData = new byte[16];  
  218.             int intRet = MemDB.Read(ref bytData, 0, 16);  
  219.             lstData.Items.Clear();   
  220.             if (intRet == 0)  
  221.             {  
  222.                 for (int i = 0; i < 16; i++)  
  223.                 {  
  224.                     lstData.Items.Add(bytData[i].ToString());  
  225.                 }  
  226.  
  227.                 if (chkWrite.Checked)  
  228.                 {  
  229.                     bytData[0]++;  
  230.                     bytData[1] += 2;  
  231.                     if (bytData[0] > 200) bytData[0] = 0;  
  232.                     if (bytData[1] > 200) bytData[1] = 0;  
  233.                     MemDB.Write(bytData, 0, 16);  
  234.                 }  
  235.             }             
  236.         }  
  237.  
  238.     }  
  239. }  
  240.  

 











本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323427,如需转载请自行联系原作者

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
<p> <strong><span style="font-size:20px;color:#FF0000;">本课程主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者</span></strong> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">1. 包含:<span style="color:#FFFF00;background-color:#FF0000;">项目源码、</span><span style="color:#FFFF00;background-color:#FF0000;">项目文档、数据库脚本、软件工具</span>等所有资料</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">2. 手把手的带你从零开始部署运行本套系统</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">3. 该项目附带的源码资料可作为毕设使用</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">4. 提供技术答疑和远程协助指导</span></strong></span><strong><span style="font-size:18px;"></span></strong> </p> <p> <br /> </p> <p> <span style="font-size:18px;"><strong>项目运行截图:</strong></span> </p> <p> <strong><span style="font-size:18px;">1)系统登陆界面</span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015433522.png" alt="" /><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">2)学生模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015575966.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">3)教师模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016127898.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">4)系统管理员</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016281177.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016369884.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">更多Java毕设项目请关注我的毕设系列课程 <a href="https://edu.csdn.net/lecturer/2104">https://edu.csdn.net/lecturer/2104</a></span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p>
<p> 课程演示环境:Windows10  </p> <p> 需要学习<span>Ubuntus</span>系统<span>YOLOv4-tiny</span>的同学请前往《<span>YOLOv4-tiny</span>目标检测实战:训练自己的数据集》 <span></span> </p> <p> <span> </span> </p> <p> <span style="color:#E53333;">YOLOv4-tiny</span><span style="color:#E53333;">来了!速度大幅提升!</span><span></span> </p> <p> <span> </span> </p> <p> <span>YOLOv4-tiny</span>在<span>COCO</span>上的性能可达到:<span>40.2% AP50, 371 FPS (GTX 1080 Ti)</span>。相较于<span>YOLOv3-tiny</span>,<span>AP</span>和<span>FPS</span>的性能有巨大提升。并且,<span>YOLOv4-tiny</span>的权重文件只有<span>23MB</span>,适合在移动端、嵌入式设备、边缘计算设备上部署。<span></span> </p> <p> <span> </span> </p> <p> 本课程将手把手地教大家使用<span>labelImg</span>标注和使用<span>YOLOv4-tiny</span>训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。<span></span> </p> <p> <span> </span> </p> <p> 本课程的<span>YOLOv4-tiny</span>使用<span>AlexAB/darknet</span>,在<span>Windows10</span>系统上做项目演示。包括:<span>YOLOv4-tiny</span>的网络结构、安装<span>YOLOv4-tiny</span>、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计<span>(mAP</span>计算<span>)</span>和先验框聚分析。 <span> </span> </p> <p> <span> </span> </p> <p> 除本课程《<span>Windows</span>版<span>YOLOv4-tiny</span>目标检测实战:训练自己的数据集》外,本人推出了有关<span>YOLOv4</span>目标检测的系列课程。请持续关注该系列的其它视频课程,包括:<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:训练自己的数据集》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:人脸口罩佩戴识别》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:中国交通标志识别》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测:原理与源码解析》<span></span> </p> <p> <span> <img alt="" src="https://img-bss.csdnimg.cn/202007061503586145.jpg" /></span> </p> <p> <span><img alt="" src="https://img-bss.csdnimg.cn/202007061504169339.jpg" /><br /> </span> </p>
<p> <strong><span style="font-size:24px;">课程简介:</span></strong><br /> <span style="font-size:18px;">历经半个多月的时间,</span><span style="font-size:18px;">Debug</span><span style="font-size:18px;">亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。</span><span></span> </p> <p> <span style="font-size:18px;">其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,</span><span style="font-size:18px;">Debug</span><span style="font-size:18px;">还亲自撸了额外的附属模块,包括字典管理模块、商品分模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程!</span><span></span> </p> <p> <br /> </p> <p> <span style="font-size:24px;"><strong>核心技术栈列表</strong></span><span style="font-size:24px;"><strong>:</strong></span> </p> <p> <br /> </p> <p> <span style="font-size:18px;">值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括</span><span style="font-size:18px;">Spring Boot</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Spring MVC</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Mybatis</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Mybatis-Plus</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Shiro(</span><span style="font-size:18px;">身份认证与资源授权跟会话等等</span><span style="font-size:18px;">)</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Spring AOP</span><span style="font-size:18px;">、防止</span><span style="font-size:18px;">XSS</span><span style="font-size:18px;">攻击、防止</span><span style="font-size:18px;">SQL</span><span style="font-size:18px;">注入攻击、过滤器</span><span style="font-size:18px;">Filter</span><span style="font-size:18px;">、验证码</span><span style="font-size:18px;">Kaptcha</span><span style="font-size:18px;">、热部署插件</span><span style="font-size:18px;">Devtools</span><span style="font-size:18px;">、</span><span style="font-size:18px;">POI</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Vue</span><span style="font-size:18px;">、</span><span style="font-size:18px;">LayUI</span><span style="font-size:18px;">、</span><span style="font-size:18px;">ElementUI</span><span style="font-size:18px;">、</span><span style="font-size:18px;">JQuery</span><span style="font-size:18px;">、</span><span style="font-size:18px;">HTML</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Bootstrap</span><span style="font-size:18px;">、</span><span style="font-size:18px;">Freemarker</span><span style="font-size:18px;">、一键打包部署运行工具</span><span style="font-size:18px;">Wagon</span><span style="font-size:18px;">等等,如下图所示:</span><span></span> </p> <img src="https://img-bss.csdn.net/201908070402564453.png" alt="" /> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:24px;">课程内容与收益</span><span style="font-size:24px;">:</span><span></span> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070403452052.png" alt="" /> </p> <p> <span style="font-size:18px;">总的来说,</span><span style="font-size:18px;">本课程是一门具有很强实践性质的“项目实战”课程,即“</span><span style="font-size:18px;">企业应用员工角色权限管理平台</span><span style="font-size:18px;">”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管理;其中,还重点讲解了如何基于</span><span style="font-size:18px;">Shiro</span><span style="font-size:18px;">的资源授权实现员工</span><span style="font-size:18px;">-</span><span style="font-size:18px;">角色</span><span style="font-size:18px;">-</span><span style="font-size:18px;">操作权限、员工</span><span style="font-size:18px;">-</span><span style="font-size:18px;">角色</span><span style="font-size:18px;">-</span><span style="font-size:18px;">数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图:</span> </p> <p> <span></span> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070404285736.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:18px;"><strong>以下为项目整体的运行效果截图:</strong></span> <span></span> </p> <img src="https://img-bss.csdn.net/201908070404538119.png" alt="" /> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405002904.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405078322.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405172638.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405289855.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405404509.png" alt="" /> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdn.net/201908070405523495.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p> <p style="text-align:left;"> <span style="font-size:18px;">值得一提的是,在本课程中,</span><span style="font-size:18px;">Debug</span><span style="font-size:18px;">也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:</span><span></span> </p> <img src="https://img-bss.csdn.net/201908070406328884.png" alt="" /> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页