`
isiqi
  • 浏览: 16035388 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
原文地址:http://blog.csdn.net/hejishan/archive/2008/03/11/2169292.aspx

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();
}

///
/// 初始化共享内存
///
/// 共享内存名称
/// 共享内存大小
///
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; //创建成功
}
///
/// 关闭共享内存
///
public void Close()
{
if (m_bInit)
{
UnmapViewOfFile(m_pwData);
CloseHandle(m_hSharedMemoryFile);
}
}

///
/// 读数据
///
/// 数据
/// 起始地址
/// 个数
///
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; //读成功
}

///
/// 写数据
///
/// 数据
/// 起始地址
/// 个数
///
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);
}
}
}

}
}

分享到:
评论

相关推荐

    c#共享内存实例源码 CSharp ShareMemory

    C#共享内存的实例,附源码和工程文件。 网上有C#的共享内存类,不过功能太简单了。 故,对此进行了改进。通过利用共享内存的一部分空间来存储当前内存中存储的数据信息(count和length),完成了对内存读写功能的...

    C# WinForm简单三层框架源码共享

    C# WinForm简单三层框架源码共享。 本框架采用三层架构实现,大家可直接在上面扩展,进行自己系统的二次开发等。 框架中数据库字符串的配置在根目录的DBCfg.xml文件中,该文件中部分内容已经加密, 文件中有两个...

    C#项目文件云存储平台(类百度网盘)+开题报告文档+需求文档+源码

    界面美观,功能齐全,适合用作毕业设计、课程设计作业等,项目均经过测试,可快速部署运行! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用...难点:查询功能、管理功能、文件操作

    OA 管理系统 OAPro (C#源码)

    文件管理:接收文件 传送文件 文件操作记录 共享下载:查看共享 上传共享 管理共享 消息管理:接收消息 发送消息 部门群发 发送记录 我的群组 公文流转:接收公文 发送公文 发送记录 通知管理:查看通知 发布通知 通知...

    wpf源码大全 精通C#3.0图书源码 详细源码 学习好用

    SharedDP 共享依赖属性示例。 StackPanelLoadedDemo WPF中元素的生命周期事件演示。 UnderstandingDP 理解依赖属性。 UnderstandRoutedEvent 理解路由事件。 第13章(\C13) 示例描述:本章学习使用...

    C#线程锁介绍源码

    1.几种同步方法的区别 lock和Monitor是.NET用一个特殊结构实现的,Monitor...这在抢先多线程操作系统中是很重要的,在这样的操作系统中,线程可以在从某个内存地址加载值之后但是在有机会更改 和存储该值之前被挂起。

    vc++ 应用源码包_3

    VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 ...

    xp/win7定时关机或睡眠程序带源码(C#)

    在寝室每天都要在床上用电脑共享的WIFI刷下微博, 熄灯后又懒得下床关机, 所以就... 不清楚不想折腾了, 一个朋友找给我的DOS操作类, 很不错, 共享给需要的朋友. (貌似网上找不到好用的定时睡眠的程序, 反正我是没找到.)

    Flippy Hero 跳跃英雄简单有趣Unity像素3d类跳跃小游戏项目源码C#

    跳跃英雄简单有趣Unity像素3d类跳跃小游戏 支持Unity版本5.6.5f1及以上 Flippy Hero – Premium Unity 模板有一个简单但有趣的游戏玩法:向左或向右跳跃来杀死敌人。但问题是你需要明智地计划你的行动,以最大限度地...

    OA办公系统源码

    专业OA办公系统源码 开发工具:Visual Studio .NET 2005 + Server2005 项目描述:OA办公系统基于B/S架构设计。 包括文件管理、共享下载、消息管理、公文流传、通知管理、内部论坛、人力资源管理、资产管理 等。 ...

    vc++ 应用源码包_1

    VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 ...

    vc++ 应用源码包_2

    VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 ...

    vc++ 应用源码包_6

    VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 ...

    vc++ 应用源码包_5

    VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 ...

    vc++ 开发实例源码包

    内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加...

    windows关于qt的数据库操作封装类以及用例,c++代码

    windows 关于qt的数据库操作封装类 以及用例: SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的功能特点有: 1. ACID事务 2. 零配置 – 无需安装和管理配置 3....

    yaf搭建的博客系统,集成了blade模板和medoo快速数据库操作类.zip

    各领域数据集,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! 软件开发设计:PHP、QT、应用软件开发、...

    Python实时垃圾分类系统(环境教程&完整源码&数据集).zip

    各领域数据集,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! 软件开发设计:PHP、QT、应用软件开发、...

    专业OA办公系统源码

    文件管理:接收文件 传送文件 文件操作记录 共享下载:查看共享 上传共享 管理共享 消息管理:接收消息 发送消息 部门群发 发送记录 我的群组 公文流转:接收公文 发送公文 发送记录 通知管理:查看通知 发布通知 通知...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 &lt;br&gt;1.1 Visual Studio开发环境安装与配置 2 &lt;br&gt;0001 安装Visual Studio 2005开发环境须知 2 &lt;br&gt;0002 配置合适的Visual Studio 2005...

Global site tag (gtag.js) - Google Analytics