首页 新闻 会员 周边

内存映射文件怎么大于10MB就无法创建成功了

0
悬赏园豆:50 [已关闭问题] 关闭于 2013-07-20 15:48

代码如下:     

        const int FILE_MAP_WRITE = 0x0002;
        const int FILE_MAP_READ = 0x0004;
        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 > 64000 * 1024) lngSize = 64000 * 1024;//0x00800000  65536(64KB)
            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;
                    }
                }

                //SYSTEM_INFO systemInfo = new SYSTEM_INFO(); ;
                //GetSystemInfo(ref systemInfo);
                ////得到系统页分配粒度
                //uint allocationGranularity = systemInfo.dwAllocationGranularity;
            }
            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; //超出数据区

            //---------------------------------------
            //创建内存映射
            m_pwData = MapViewOfFile(m_hSharedMemoryFile, FILE_MAP_READ, 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)
                {
                    //初始化
                }
            }
            //----------------------------------------

            if (m_bInit)
            {
                Marshal.Copy(m_pwData, bytData, lngAddr, lngSize);

                UnmapViewOfFile(m_pwData);
            }
            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; //超出数据区

            //---------------------------------------
            //创建内存映射
            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)
                {
                    //初始化
                }
            }
            //----------------------------------------
            if (m_bInit)
            {
                Marshal.Copy(bytData, lngAddr, m_pwData, lngSize);

                UnmapViewOfFile(m_pwData);

            }
            else
            {
                return 1; //共享内存未初始化
            }
            return 0;     //写成功
        }

 

lngSize比较小的时候完全没有问题,
但是我有一个DataTable有10MB,
序列化为byte[] 数组初始化成功之后再Read or Write
这时内存映射文件就无法创建成功了

我的电脑是2G的内存,

求解。。。。。。。。。。。。。。。。。。

< >
分享
所有回答(2)
0

GetLastError

空明流光 | 园豆:106 (初学一级) | 2013-07-19 14:42

创建失败后调用看看返回值

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2013-07-19 14:43

@沧海一杰: 返回值等于5 怎么解决啊 

支持(0) 反对(0) alone__ | 园豆:60 (初学一级) | 2013-07-19 15:07

@alone__: 我也百度了下,好像是【5】-拒绝访问。你不行了谷哥吧,用E文找一找看看。

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2013-07-19 16:06

@沧海一杰: google半天了,没找到解决办法, E文是啥,

对了,你有这方面的例子吗,

支持(0) 反对(0) alone__ | 园豆:60 (初学一级) | 2013-07-19 16:56
0

开始:

Init lngSize是从0开始慢慢增加到10M

Read or Write lngSize也是从0开始慢慢增加到10M

 

修改之后:

Init 的时候我把lngSize=64M 

Read or Write 的时候lngSize从0开始慢慢增加到10M

这样就能创建成功了

 

因为我的应用程序是WebForm 每次使用之前都需要

调用Init方法,在去Read or Write

alone__ | 园豆:60 (初学一级) | 2013-07-20 15:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册