记录:C#创建共享内存,可用于两个独立进程间的通信(转)
2021-05-15 14:28
阅读:711
标签:message comm 失败 container exec leo handle mars entry
https://www.cnblogs.com/hepeng/p/8780552.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; //写成功
}
}
|
两个程序进行读和写:
1
2
3
4
5
6
|
new ShareMem(); "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();
|
1
2
3
|
MemDB.Init( "testrom" , 1024 * 1024);
byte [] bytData = Encoding.UTF8.GetBytes( string .Join( "\r\n" , allLines));
MemDB.Write(bytData, 0, bytData.Length); |
记录:C#创建共享内存,可用于两个独立进程间的通信(转)
标签:message comm 失败 container exec leo handle mars entry
原文地址:https://www.cnblogs.com/xihong2014/p/14704735.html
上一篇:c# CAD文件读取
文章来自:搜素材网的编程语言模块,转载请注明文章出处。
文章标题:记录:C#创建共享内存,可用于两个独立进程间的通信(转)
文章链接:http://soscw.com/index.php/essay/85823.html
文章标题:记录:C#创建共享内存,可用于两个独立进程间的通信(转)
文章链接:http://soscw.com/index.php/essay/85823.html
评论
亲,登录后才可以留言!