首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • reateFileMapping和返回相同的句柄?MapViewOfFile返回相同的指针? [已结帖,结帖人:vcokwap]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • vcokwap
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-11-18 16:27:42 楼主
    如:
    for(int i=10;i <50;i++)
    {
      h=CreateFileMapping(...) //strname=i
      p=MapViewOfFile(h,....)
     
    //每个strname不同
    }
    1:但我发现有几个返回的h相同?为什么不同的strname会返回相同的h
    2:不同的h用MapViewOfFile时,也返回了相同的p

    thanks.

    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 8

      2

      19

    发表于:2008-11-18 17:04:081楼 得分:10
    应该都不会相同,把代码贴完整。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • windyloft
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 17:07:062楼 得分:20
    没道理。不能能相同,要是想同那还不乱了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • vcokwap
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 18:44:043楼 得分:0
    最新测试出来的结果是:直接在界面Form1调用CreateFileMapping没重复的h出现,但我调用类里的就有重复出现
    public class mem_1
    {
    ......

            public  int OpenMem(ref string h, ref string pw,string strName,long lngSize)
            {
               
                if (lngSize <= 0 || lngSize > 0x00800000) lngSize = 0x00800000;
                m_MemSize = lngSize;
                if (strName.Length > 0)
                {
                    //创建内存共享体(INVALID_HANDLE_VALUE)
                    //_SECURITY_ATTRIBUTES attrib = new _SECURITY_ATTRIBUTES();

                  // m_hSharedMemoryFile = CreateFileMapping(INVALID_HANDLE_VALUE, ref  attrib, PAGE_READWRITE | SEC_COMMIT, 0, (uint)lngSize, strName);


                    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; //参数错误   
                }
                h = m_hSharedMemoryFile.ToString();
                pw = m_pwData.ToString();
                return 0;    //创建成功
            }

    }
    ----以下是调用-----------------------------
    form1.cs
                for (int i = 10000; i < 10075; i++)
                {
                    string h="", pw="";
                    mem_1 a = new mem_1();

                    string sname = "yy" + i.ToString();
                    isCreateMyMem=a.OpenMem(ref h,ref pw,sname,  512);

                    textBox1.Text += i.ToString()+"h:" + h.ToString() + " pw:" + pw.ToString() + "\r\n";
                }
    返回的h就有重复的

    谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 8

      2

      19

    发表于:2008-11-19 01:17:204楼 得分:30
    是不是mem_1的析构函数中关闭了FileMapping?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhoujianhei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-19 08:21:175楼 得分:20
              for (int i = 10000; i < 10075; i++)
                {
                    string h="", pw="";
                    mem_1 a = new mem_1();

                    string sname = "yy" + i.ToString();
                    isCreateMyMem=a.OpenMem(ref h,ref pw,sname,  512);

    if(isCreateMyMem == 0)
                    textBox1.Text += i.ToString()+"h:" + h.ToString() + " pw:" + pw.ToString() + "\r\n";
                }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shanying_0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-19 08:24:396楼 得分:20
    应该是不相同的,但是可能出现这个文件所站用的内存被释放掉后,其他的文件又利用了,这样的话可能出现相同的!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • vcokwap
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-19 09:39:137楼 得分:0
    谢谢各位,是我主动关闭了造成的
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved