共享内存操作类 C#

转载 2007年10月13日 11:05:00

 

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

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


        
/**//// <summary>
        
/// 初始化共享内存
        
/// </summary>
        
/// <param name="strName">共享内存名称</param>
        
/// <param name="lngSize">共享内存大小</param>
        
/// <returns></returns>

        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, 00, (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;     //创建成功
        }

        
/**//// <summary>
        
/// 关闭共享内存
        
/// </summary>

        public void Close()
        
...{
            
if (m_bInit)
            
...{
                UnmapViewOfFile(m_pwData);
                CloseHandle(m_hSharedMemoryFile);
            }

        }


        
/**//// <summary>
        
/// 读数据
        
/// </summary>
        
/// <param name="bytData">数据</param>
        
/// <param name="lngAddr">起始地址</param>
        
/// <param name="lngSize">个数</param>
        
/// <returns></returns>

        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;     //读成功
        }


 
        
/**//// <summary>
        
/// 写数据
        
/// </summary>
        
/// <param name="bytData">数据</param>
        
/// <param name="lngAddr">起始地址</param>
        
/// <param name="lngSize">个数</param>
        
/// <returns></returns>

        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;     //写成功
        }

    }

}

c++ 内存映射文件进程间共享数据

int main(int argc, char *argv[])   {       //RecursiveDelete("C:\\20_128\\");       //SelfRun("runMo...
  • xbsoul
  • xbsoul
  • 2016年01月11日 13:55
  • 2080

使用内存文件映射实现共享内存

不使用IPC中的共享内存(shm),使用内存文件映射的方式来实现共享内存 共享内存写入者: // 使用文件内存映射进行内存共享 #include #include #include #inc...
  • NB_vol_1
  • NB_vol_1
  • 2016年07月15日 12:02
  • 1170

关于Go语言共享内存操作的小实例

wrapper.c #include #include #include #include int my_shm_open(char* filename, int open_flag...
  • fyxichen
  • fyxichen
  • 2015年06月09日 08:54
  • 1454

C#共享内存操作类; 基于 COM+ 的结构化存储..

  • 2009年04月09日 11:11
  • 23KB
  • 下载

共享内存操作类(C#源码)

VC++的共享内存操作代码实现起来相对比较容易,但是用C#语言来实现,就有一定难度,由于工作需要,把以前VC开发的共享内存代码要用C#实现,别说,还费了不少周折,毕竟C#操作API函数和地址指针不是那...
  • xwnxwn
  • xwnxwn
  • 2015年04月21日 20:30
  • 388

共享内存操作类(C#源码)

VC++的共享内存操作代码实现起来相对比较容易,但是用C#语言来实现,就有一定难度,由于工作需要,把以前VC开发的共享内存代码要用C#实现,别说,还费了不少周折,毕竟C#操作API函数和地址指针不是那...
  • liguocheng
  • liguocheng
  • 2012年06月13日 20:41
  • 469

C# 共享内存操作类

以下是一个C#操作内存的一个类,只要将下面的类添加到相应的项目中,该项目就可以对内存进行直接操作! using System.Runtime.InteropServices;    //添加如下命名...
  • wzjun8888
  • wzjun8888
  • 2012年10月17日 09:16
  • 176

C#操作共享内存读写工程

  • 2018年01月02日 13:19
  • 87KB
  • 下载

VC++ 共享内存读写操作

  • 2014年01月02日 13:58
  • 4.39MB
  • 下载

C++操作共享内存读写代码

  • 2018年01月02日 13:20
  • 1.14MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:共享内存操作类 C#
举报原因:
原因补充:

(最多只允许输入30个字)