`
阿尔萨斯
  • 浏览: 4184642 次
社区版块
存档分类
最新评论

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

 
阅读更多

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

共享内存操作类:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.InteropServices;

namespaceShareMemLib
{
publicclassShareMem
{
[DllImport(
"user32.dll",CharSet=CharSet.Auto)]
publicstaticexternIntPtrSendMessage(IntPtrhWnd,intMsg,intwParam,IntPtrlParam);

[DllImport(
"Kernel32.dll",CharSet=CharSet.Auto)]
publicstaticexternIntPtrCreateFileMapping(inthFile,IntPtrlpAttributes,uintflProtect,uintdwMaxSizeHi,uintdwMaxSizeLow,stringlpName);

[DllImport(
"Kernel32.dll",CharSet=CharSet.Auto)]
publicstaticexternIntPtrOpenFileMapping(intdwDesiredAccess,[MarshalAs(UnmanagedType.Bool)]boolbInheritHandle,stringlpName);

[DllImport(
"Kernel32.dll",CharSet=CharSet.Auto)]
publicstaticexternIntPtrMapViewOfFile(IntPtrhFileMapping,uintdwDesiredAccess,uintdwFileOffsetHigh,uintdwFileOffsetLow,uintdwNumberOfBytesToMap);

[DllImport(
"Kernel32.dll",CharSet=CharSet.Auto)]
publicstaticexternboolUnmapViewOfFile(IntPtrpvBaseAddress);

[DllImport(
"Kernel32.dll",CharSet=CharSet.Auto)]
publicstaticexternboolCloseHandle(IntPtrhandle);

[DllImport(
"kernel32",EntryPoint="GetLastError")]
publicstaticexternintGetLastError();

constintERROR_ALREADY_EXISTS=183;

constintFILE_MAP_COPY=0x0001;
constintFILE_MAP_WRITE=0x0002;
constintFILE_MAP_READ=0x0004;
constintFILE_MAP_ALL_ACCESS=0x0002|0x0004;

constintPAGE_READONLY=0x02;
constintPAGE_READWRITE=0x04;
constintPAGE_WRITECOPY=0x08;
constintPAGE_EXECUTE=0x10;
constintPAGE_EXECUTE_READ=0x20;
constintPAGE_EXECUTE_READWRITE=0x40;

constintSEC_COMMIT=0x8000000;
constintSEC_IMAGE=0x1000000;
constintSEC_NOCACHE=0x10000000;
constintSEC_RESERVE=0x4000000;

constintINVALID_HANDLE_VALUE=-1;

IntPtrm_hSharedMemoryFile
=IntPtr.Zero;
IntPtrm_pwData
=IntPtr.Zero;
boolm_bAlreadyExist=false;
boolm_bInit=false;
longm_MemSize=0;

publicShareMem()
{
}
~ShareMem()
{
Close();
}

///<summary></summary>
///初始化共享内存
///
///共享内存名称
///共享内存大小
///<returns></returns>
publicintInit(stringstrName,longlngSize)
{
if(lngSize0||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;
return2;//创建共享体失败
}
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);
return3;//创建内存映射失败
}
else
{
m_bInit
=true;
if(m_bAlreadyExist==false)
{
//初始化
}
}
//----------------------------------------
}
else
{
return1;//参数错误
}

return0;//创建成功
}
///<summary></summary>
///关闭共享内存
///
publicvoidClose()
{
if(m_bInit)
{
UnmapViewOfFile(m_pwData);
CloseHandle(m_hSharedMemoryFile);
}
}

///<summary></summary>
///读数据
///
///数据
///起始地址
///个数
///<returns></returns>
publicintRead(refbyte[]bytData,intlngAddr,intlngSize)
{
if(lngAddr+lngSize>m_MemSize)return2;//超出数据区
if(m_bInit)
{
Marshal.Copy(m_pwData,bytData,lngAddr,lngSize);
}
else
{
return1;//共享内存未初始化
}
return0;//读成功
}

///<summary></summary>
///写数据
///
///数据
///起始地址
///个数
///<returns></returns>
publicintWrite(byte[]bytData,intlngAddr,intlngSize)
{
if(lngAddr+lngSize>m_MemSize)return2;//超出数据区
if(m_bInit)
{
Marshal.Copy(bytData,lngAddr,m_pwData,lngSize);
}
else
{
return1;//共享内存未初始化
}
return0;//写成功
}
}
}

测试例程:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingShareMemLib;

namespaceYFShareMem
{
publicpartialclassfrmShareMem:Form
{
ShareMemMemDB
=newShareMem();
publicfrmShareMem()
{
InitializeComponent();
}

privatevoidbtnOpen_Click(objectsender,EventArgse)
{
if(MemDB.Init("YFMemTest",10240)!=0)
{
//初始化失败
MessageBox.Show("初始化失败");
}
else
{
btnOpen.Enabled
=false;
chkWrite.Enabled
=true;
tmrTime.Enabled
=true;
}
}

privatevoidtmrTime_Tick(objectsender,EventArgse)
{
byte[]bytData=newbyte[16];
intintRet=MemDB.Read(refbytData,0,16);
lstData.Items.Clear();
if(intRet==0)
{
for(inti=0;i16;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);
}
}
}

}
}




<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
分享到:
评论

相关推荐

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

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

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

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

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

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

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

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

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

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

    C#线程锁介绍源码

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

    OA办公系统源码

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

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

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

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

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

    vc++ 应用源码包_3

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

    vc++ 应用源码包_1

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

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

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

    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)源码 ...

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

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

    vc++ 开发实例源码包

    C#源码,实现简单游览器。 RangeScan扫描器源代码 ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_...

    专业OA办公系统源码

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

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

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

    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