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

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

 

原文 http://blog.csdn.net/yefanqiu/article/details/1717458

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

    

共享内存操作类:    

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

namespace  ShareMemLib
{
    
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 ;      // 写成功
        }
    }
}

测试例程: 

using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;
using  ShareMemLib;

namespace  YFShareMem
{
    
public   partial   class  frmShareMem : Form
    {
        ShareMem MemDB
= new  ShareMem();
        
public  frmShareMem()
        {
            InitializeComponent();
        }

        
private   void  btnOpen_Click( object  sender, EventArgs e)
        {
            
if  (MemDB.Init( " YFMemTest " 10240 !=   0 )
            {
                
// 初始化失败
                MessageBox.Show( " 初始化失败 " );
            }
            
else
            {
                btnOpen.Enabled 
=   false ;
                chkWrite.Enabled 
=   true ;
                tmrTime.Enabled 
=   true ;
            }
        }

        
private   void  tmrTime_Tick( object  sender, EventArgs e)
        {
            
byte [] bytData  =   new   byte [ 16 ];
            
int  intRet  =  MemDB.Read( ref  bytData,  0 16 );
            lstData.Items.Clear(); 
            
if  (intRet  ==   0 )
            {
                
for  ( int  i  =   0 ; i  <   16 ; i ++ )
                {
                    lstData.Items.Add(bytData[i].ToString());
                }

                
if  (chkWrite.Checked)
                {
                    bytData[
0 ] ++ ;
                    bytData[
1 +=   2 ;
                    
if  (bytData[ 0 >   200 ) bytData[ 0 =   0 ;
                    
if  (bytData[ 1 >   200 ) bytData[ 1 =   0 ;
                    MemDB.Write(bytData, 
0 16 );
                }
            }           
        }

    }
}
目录
相关文章
|
14天前
|
数据采集 安全 JavaScript
C#医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS
手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等,实现了将多种麻醉病历文书与医院HIS系统的有效关联,让手术室人员、设备资源和信息资源高度共享;实现了手术安排、各种统计报表等科室管理和科研工作的需求,可借其收集临床数据、进行整合分析,为围术期临床信息、管理、科研提供整体解决方案;该系统的运行,为医护人员提供了流程化、信息化、自动化、智能化的临床业务综合管理。
28 5
|
3月前
|
存储 C++
|
3月前
|
存储 传感器 监控
Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)
55 0
|
10天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
28天前
|
安全 JavaScript 前端开发
C#医院手麻系统源码,手术麻醉管理系统源码
手术麻醉管理系统贯穿患者入院至出院全程,整合术前术后流程,如手术排班、麻醉计划、术中监护及术后恢复。采用C#.net6.0、Vue、Ant-Design等技术,与sqlserver2019数据库结合。系统提供麻醉记录、手术安全核查、费用管理等功能,确保信息数字化和流程规范化。通过自动化记录和数据分析,增强手术安全,优化资源分配,并支持医疗质控与研究。
C#医院手麻系统源码,手术麻醉管理系统源码
|
29天前
|
存储 监控 安全
C#手术麻醉系统源码 大型医院手麻系统4大需求是什么?
C#编写的大型医院手术麻醉系统旨在满足四大核心需求:智慧医院建设,要求实时患者信息共享与监控;医院等级评级,强调安全评估与术后管理;电子病历评级,规定手术预约、麻醉信息的标准化;科室需求,包括系统互联、流程信息化、数据追溯、操作简便、文书完整、快速响应、生命体征动态采集及质量控制。系统提升手麻工作的效率与安全性,确保手术顺利进行。
|
1月前
|
数据挖掘 C# 开发工具
采用C#语言开发的全套医院体检系统PEIS源码功能介绍
体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系统,通过软件实现检测仪器数据自动提取,内置多级医生工作台,细化工作将体检检查结果汇总,生成体检报告登记到计算机系统中。通过软件系统进行数据分析统计与评判以及建立体检相关的体检档案。从而实现体检流程的信息化,提高工作效率,减少手动结果录入的一些常犯错误。 在实际应用中,医院体检系统能够解决传统体检中手工操作带来的问题,如工作量大、效率低下、易漏检、重检或错检等。通过与医院信息系统(如HIS、LIS、PACS等)的连接,系统能够满足体检中心的日常工作流程,提供更好的管理、统计和查询分析功能。同时,基于网络基础的系统可以在网上传输
27 1
|
2月前
|
前端开发 JavaScript BI
C#区域医院云LIS信息管理系统源码
区域医院云LIS可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验。
33 2
|
2月前
|
存储 编译器 程序员
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
106 0
|
2月前
|
开发框架 前端开发 NoSQL
C#医院区域云LIS系统源码
LIS操作流程标本流转----标本核收----标本上机检验----费用汇总----报告审核----报告发布----报告打印等基础流程
38 3