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

共享内存操作类(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>
///<paramname="strName">共享内存名称</param>
///<paramname="lngSize">共享内存大小</param>
///<returns></returns>
publicintInit(stringstrName,longlngSize)
{
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;
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>
///<paramname="bytData">数据</param>
///<paramname="lngAddr">起始地址</param>
///<paramname="lngSize">个数</param>
///<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>
///<paramname="bytData">数据</param>
///<paramname="lngAddr">起始地址</param>
///<paramname="lngSize">个数</param>
///<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;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#工具类源码大全

    总的来说,"c#工具类源码大全"为C#开发者提供了丰富的资源,涵盖了Web开发、AD域操作、通用功能、数据库访问和安全等多个方面。学习和使用这些工具类不仅可以提升开发效率,也有助于深入理解和掌握C#及其相关技术。

    C#文件共享软件源码.zip

    标题中的"C#文件共享软件源码.zip"表明这是一个基于C#编程语言开发的文件共享软件的源代码包。C#是Microsoft开发的一种面向对象的、类型安全的编程语言,广泛用于构建Windows桌面应用、Web应用以及游戏等。在这个...

    飞鸽传书c#源码

    C#的System.IO命名空间提供了丰富的文件操作类,如FileStream、BinaryReader和BinaryWriter。源码中,飞鸽传书会先将文件内容读入内存,然后通过网络socket将数据分块发送到接收方,接收方再将接收到的数据写入本地...

    文件共享之c#实现(含源码)

    在本项目中,"文件共享之c#实现(含源码)",我们将探讨如何使用C#编程语言来构建一个简单的文件共享应用。C#是微软开发的一种面向对象的编程语言,特别适合用于构建Windows应用程序和网络服务。 首先,我们要理解C#...

    C# CPU内存使用率 实例源码(系统操作)

    在C#编程中,了解如何监控和管理CPU与内存的使用率是至关重要的。这不仅有助于优化程序性能,还能防止资源...这个实例源码应该包含了如何在C#中获取和展示CPU及内存使用率的详细步骤,为你的系统操作提供有力的支持。

    网络象棋对战C#源码

    网络象棋对战C#源码是一个用于开发网络象棋游戏的应用程序,它基于C#编程语言,提供了实现在线对战功能的完整代码基础。在深入理解这一源码之前,我们需要先了解一些基本的背景知识。 1. **C#语言**: C#是由微软...

    C# WiFi共享工具源码

    在IT领域,C#是一种广泛使用的...在《XMWiFi共享工具源码》这个项目中,通过深入研究源代码,你可以学习到上述各个技术点的实际应用,这对于提升你的C#编程技能,特别是网络编程和系统级操作的理解,是非常有价值的。

    C#公共工具类源码.rar

    3. **文件和目录操作类**:提供了创建、删除、复制、移动文件或目录的方法,以及读写文件等操作,这些在处理文件系统时非常实用。 4. **网络通信类**:可能包含HTTP请求、TCP/UDP通信等网络相关的功能,对于需要与...

    C#局域网桌面共享

    本例中的"C#局域网桌面共享"项目旨在实现一个能够进行局域网内文件传输、桌面截屏以及图片压缩功能的软件。这个软件使得在同一网络环境下的用户可以方便地共享他们的桌面视图,提高协作效率。 首先,我们来详细讨论...

    C# 获取本地计算机所有共享文件和路径源码

    总的来说,使用C#获取本地计算机的所有共享文件和路径,主要是通过WMI接口与操作系统进行交互,通过查询Win32_Share类来获取共享信息。这个过程涉及了系统管理、网络共享以及错误处理等多个方面的知识,对于理解和...

    c#编写的内存读取修改器

    在内存读取修改器的场景中,C#提供了System.Diagnostics命名空间下的Process和MemoryMappedFile等类,可以用来访问和操作进程的内存。 1. **内存读取:** 在C#中,要实现内存读取,首先需要获取目标进程的句柄,这...

    贪吃蛇c#源码 共享

    《贪吃蛇C#源码解析与探讨》 贪吃蛇是一款经典的电子游戏,自1976年首次出现以来,便在全球范围内广受欢迎。...总之,贪吃蛇C#源码的学习和分析,无论是理论知识还是实际操作,都能带来丰富的收获。

    C#抽奖程序源码共享

    首先,"C#抽奖程序源码共享"这个标题表明我们讨论的是一个用C#编写的程序,它的主要功能是进行抽奖活动。抽奖程序通常包含设定奖项、设置中奖概率和数量、记录和展示中奖结果等模块。C#提供了丰富的类库和功能,可以...

    办公自动化OA系统(C# 源码)

    协同办公模块包括任务分配、文件共享、在线会议等功能,C#源码中将涉及到多用户协作的处理和文件I/O操作。 ### 4. 数据库设计与ORM 在SQL Server 2005中,通常会设计一套包括用户表、角色表、工作流表、公文表等...

    C#挂机锁源码

    挂机锁的应用场景通常包括读写共享资源、文件操作、数据库访问等,确保这些操作不会被并发执行导致数据混乱。在本源码中,可能会包含对特定资源的加锁、解锁逻辑,以及异常处理机制,以确保程序的稳定性和安全性。 ...

    企业资产管理系统(c#源码)

    在C#源码的基础上,开发者可以根据企业的具体需求进行定制化开发,添加新的功能模块或者优化现有功能。例如,可以增加条形码或RFID技术进行资产实物追踪,或者引入人工智能进行预测性维护,提高资产管理的智能化水平...

    c#源码商店.zip

    【标题】:“C#源码商店” 【描述】:这个压缩包“c#源码商店.zip”似乎包含了一系列与C#编程语言相关的源代码。它可能是由一个或多个开发者或团队创建,旨在展示、销售或共享他们的C#编程成果。由于重复的描述,...

    C#操作INI文件源码(201903)

    标题 "C#操作INI文件源码(201903)" 暗示着这是一个关于使用C#编程语言处理INI配置文件的代码资源。INI文件是早期Windows系统中广泛使用的文本格式,用于存储应用程序的配置设置。这些文件通常包含键值对,易于读写,...

    c#编写网络助手源码文件

    【描述】"C#编写网络助手源码" 提示我们这是一个开源或共享的代码库,用于创建一个能够帮助用户进行网络操作的软件工具。网络助手可能包含多种功能,如网络测速、数据抓包、HTTP/HTTPS请求、端口扫描、网络诊断等。...

Global site tag (gtag.js) - Google Analytics