-
using System;
-
using System.Collections.Generic;
-
using System.Linq;
-
using System.Text;
-
using System.Threading.Tasks;
-
using System.Runtime.InteropServices;
-
namespace ConsoleApplication2
-
{
-
class Program
-
{
-
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Auto)]
-
public static extern IntPtr CreateFile(string lpFileName,
-
int dwDesiredAccess, int dwShareMode, IntPtr lpSecurityAttributes,
-
int dwCreationDisposition, int dwFlagsAndAttributes,
-
IntPtr hTemplateFile);
-
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Auto)]
-
public static extern IntPtr CreateFileMapping(IntPtr hFile,
-
IntPtr lpAttributes, int flProtect,
-
int dwMaximumSizeLow, int dwMaximumSizeHigh, string lpName);
-
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
-
private static extern IntPtr OpenFileMapping(int dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, string lpName);
-
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
-
private static extern IntPtr MapViewOfFile(IntPtr hFileMapping, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, uint dwNumberOfBytesToMap);
-
[DllImport("kernel32", EntryPoint = "GetLastError")]
-
public static extern int GetLastError();
-
[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 bool UnmapViewOfFile(IntPtr pvBaseAddress);
-
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
-
public static extern bool CloseHandle(IntPtr handle);
-
//原文链接:https://blog.csdn.net/gao271003105/article/details/81014094
-
public const int FILE_MAP_READ = 0x0004;
-
public static IntPtr fileMapping = IntPtr.Zero;
-
public static IntPtr mapView = IntPtr.Zero;
-
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_READWRITE = 0x04;
-
const int INVALID_HANDLE_VALUE = -1;
-
const int ERROR_ALREADY_EXISTS = 183;
-
private bool bValid;
-
static bool m_bAlreadyExist = false;
-
static bool m_bInit = false;
-
static long m_MemSize = 0;
-
public void ShareMemoryHelper(string name, uint length)
-
{
-
bValid = GetShareMemoryMap(name, length);
-
}
-
public void ShareMemoryHelper()
-
{
-
}
-
// ~ShareMemoryHelper()
-
// {
-
// Close();
-
// }
-
public bool GetShareMemoryMap(string name, uint length)
-
{
-
m_MemSize = length;
-
fileMapping = OpenFileMapping(PAGE_READWRITE, false, name);
-
if (fileMapping == IntPtr.Zero)
-
{
-
return false;
-
}
-
mapView = MapViewOfFile(fileMapping, (uint)FILE_MAP_READ, 0, 0, length);
-
if (mapView == IntPtr.Zero)
-
{
-
int a = GetLastError();
-
return false;
-
}
-
m_bInit = true;
-
return true;
-
}
-
public static int CreateShareMemoryMap(string strName, long lngSize)
-
{
-
if (lngSize 0x00800000) lngSize = 0x00800000;
-
m_MemSize = lngSize;
-
if (strName.Length > 0)
-
{
-
fileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, (uint)
-
PAGE_READWRITE, 0, (uint)lngSize, strName);
-
if (fileMapping == IntPtr.Zero)
-
{
-
return 2;
-
}
-
if (GetLastError() == ERROR_ALREADY_EXISTS)
-
{
-
m_bAlreadyExist = true;
-
}
-
else
-
{
-
m_bAlreadyExist = false;
-
}
-
mapView = MapViewOfFile(fileMapping, FILE_MAP_WRITE, 0, 0, (uint)lngSize);
-
if (mapView == IntPtr.Zero)
-
{
-
m_bInit = false;
-
CloseHandle(fileMapping);
-
return 3;
-
}
-
else
-
{
-
m_bInit = true;
-
if (m_bAlreadyExist == false)
-
{
-
}
-
}
-
}
-
else
-
{
-
return 1;
-
}
-
return 0;
-
}
-
public static int Write(byte[] bytData, int lngAddr, int lngSize)
-
{
-
if (lngAddr + lngSize > m_MemSize) return 2;
-
if (m_bInit)
-
{
-
Marshal.Copy(bytData, lngAddr, mapView, lngSize);
-
}
-
else
-
{
-
return 1;
-
}
-
return 0;
-
}
-
public static int Read(ref byte[] bytData, int lngAddr, int lngSize)
-
{
-
if (lngAddr + lngSize > m_MemSize) return 2;
-
if (m_bInit)
-
{
-
Marshal.Copy(mapView, bytData, lngAddr, lngSize);
-
}
-
else
-
{
-
return 1;
-
}
-
return 0;
-
}
-
public static void Close()
-
{
-
if (m_bInit)
-
{
-
UnmapViewOfFile(mapView);
-
CloseHandle(fileMapping);
-
}
-
}
-
static void Main(string[] args)
-
{
-
CreateShareMemoryMap("sss", 200);
-
byte[] ss = { 0,0,0,0,0 };
-
//Write(ss, 0, 2);
-
int k= Read(ref ss, 0, 5);
-
int st = ss[1];
-
Console.ReadLine();
-
Close();
-
}
-
}
-
}