.NET进程通信机制——内存映像文件

 对win32api的封装

using  System;
using  System.Runtime.InteropServices;

namespace  WindowsApplication1
{
    
internal class Win32
    

        
public static readonly IntPtr InvalidHandleValue = new IntPtr(-1);
        
public const UInt32 FILE_MAP_WRITE = 2;
        
public const UInt32 PAGE_READWRITE = 0x04;

        [DllImport(
"Kernel32")]
        
public static extern IntPtr CreateFileMapping(IntPtr hFile,
            IntPtr pAttributes, UInt32 flProtect,
            UInt32 dwMaximumSizeHigh, UInt32 dwMaximumSizeLow, String pName);

        [DllImport(
"Kernel32")]
        
public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject,
            UInt32 dwDesiredAccess,
            UInt32 dwFileOffsetHigh, UInt32 dwFileOffsetLow,
            IntPtr dwNumberOfBytesToMap);

        [DllImport(
"Kernel32")]
        
public static extern Boolean UnmapViewOfFile(IntPtr address);
    
    }

}

测试用的winform设计界面

写入内存映射文件的代码
private   void  Write_Click( object  sender, System.EventArgs e)
        
{
            IntPtr hFileMap 
= IntPtr.Zero;
            IntPtr address;

            hFileMap 
= Win32.CreateFileMapping(Win32.InvalidHandleValue,
                IntPtr.Zero, Win32.PAGE_READWRITE,
                
00x100"MYSHARE");

            
            
if (hFileMap == IntPtr.Zero)
                
throw new Exception("CreateFileMapping():无法创建内存映像文件");

            address 
= Win32.MapViewOfFile(hFileMap, Win32.FILE_MAP_WRITE,
                
00, IntPtr.Zero);

            
byte[] bs = System.Text.Encoding.GetEncoding("gb2312").GetBytes(this.textBox1.Text);

            
for(int i=0;i<bs.Length;i++)
            
{
                Marshal.WriteByte(address,i,bs[i]);
            }

            Marshal.WriteByte(address,bs.Length,
0);


            Win32.UnmapViewOfFile(address);

        }

从内存映射文件读出的代码

private   void  Read_Click( object  sender, System.EventArgs e)
        
{
            IntPtr hFileMap 
= IntPtr.Zero;
            IntPtr address;

            hFileMap 
= Win32.CreateFileMapping(Win32.InvalidHandleValue,
                IntPtr.Zero, Win32.PAGE_READWRITE,
                
00x100"MYSHARE");

            
if (hFileMap == IntPtr.Zero)
                
throw new Exception("CreateFileMapping():无法创建内存映像文件");

            address 
= Win32.MapViewOfFile(hFileMap, Win32.FILE_MAP_WRITE,
                
00, IntPtr.Zero);

            
byte[] bs = new byte[0x100];
            
int i;
            
for(i=0;i<bs.Length;i++)
            
{
                
byte temp = Marshal.ReadByte(address,i);
                
if(temp==0)
                    
break;
                bs[i] 
= temp;
            
            }


            Win32.UnmapViewOfFile(address);

            
this.textBox2.Text = System.Text.Encoding.GetEncoding("gb2312").GetString(bs,0,i);

        }

测试结果截图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值