记录:C#创建共享内存,可用于两个独立进程间的通信(转)
2021-05-15 14:28
标签:message comm 失败 container exec leo handle mars entry https://www.cnblogs.com/hepeng/p/8780552.html 两个程序进行读和写: 记录:C#创建共享内存,可用于两个独立进程间的通信(转) 标签:message comm 失败 container exec leo handle mars entry 原文地址:https://www.cnblogs.com/xihong2014/p/14704735.html
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 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;
//写成功
}
}
ShareMem MemDB = new
ShareMem();
MemDB.Init("testrom"
, 1024 * 1024);
byte
[] bytData =
new
byte
[1024 * 1024];
int
intRet = MemDB.Read(
ref
bytData, 0, 1024 * 1024);
txtAll.Text = Encoding.UTF8.GetString(bytData);
txtAll.Select(txtAll.TextLength, 0);
txtAll.ScrollToCaret();
MemDB.Init(
"testrom"
, 1024 * 1024);
byte
[] bytData = Encoding.UTF8.GetBytes(
string
.Join(
"\r\n"
, allLines));
MemDB.Write(bytData, 0, bytData.Length);
上一篇:c# CAD文件读取
文章标题:记录:C#创建共享内存,可用于两个独立进程间的通信(转)
文章链接:http://soscw.com/index.php/essay/85823.html