C#使用MemoryStream类读写内存

在做日本的BCP项目的时候,没有遇到数据库,全部是从内存取的数据

现提供从内存取数据的方法:,这个是我从网上copy的

因为日本的那个项目,我们用的是c++程序读写共有内存,有一个c++写的dll文件

我们调用那个文件即可.

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

namespace  CrazyCoder.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 );
}

}

}
}

  

转载于:https://www.cnblogs.com/naariah/articles/2105406.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值