CreateFileMapping的MSDN翻译和使用心得

翻译 2002年01月16日 17:38:00

测试创建和打开文件映射的时候老是得到"句柄无效"的错误, 仔细看了MSDN以后才发觉是函数认识不透, 这里把相关的解释翻译出来

HANDLE CreateFileMapping(
  HANDLE hFile,                       //物理文件句柄
  LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
  DWORD flProtect,                    //保护设置
  DWORD dwMaximumSizeHigh,            //高位文件大小
  DWORD dwMaximumSizeLow,             //低位文件大小
  LPCTSTR lpName                      //共享内存名称
);

1) 物理文件句柄
   任何可以获得的物理文件句柄, 如果你需要创建一个物理文件无关的内存映射也无妨, 将它设置成为 0xFFFFFFFF(INVALID_HANDLE_VALUE)就可以了.

   如果需要和物理文件关联, 要确保你的物理文件创建的时候的访问模式和"保护设置"匹配, 比如: 物理文件只读, 内存映射需要读写就会发生错误. 推荐你的物理文件使用独占方式创建.

   如果使用 INVALID_HANDLE_VALUE, 也需要设置需要申请的内存空间的大小, 无论物理文件句柄参数是否有效, 这样 CreateFileMapping 就可以创建一个和物理文件大小无关的内存空间给你, 甚至超过实际文件大小, 如果你的物理文件有效, 而大小参数为0, 则返回给你的是一个和物理文件大小一样的内存空间地址范围.  返回给你的文件映射地址空间是可以通过复制, 集成或者命名得到, 初始内容为0.

2) 保护设置
   就是安全设置, 不过一般设置NULL就可以了, 使用默认的安全配置. 在win2k下如果需要进行限制, 这是针对那些将内存文件映射共享给整个网络上面的应用进程使用是, 可以考虑进行限制.

3) 高位文件大小
   弟兄们, 我想目前我们的机器都是32位的东东, 不可能得到超过32位进程所能寻址的私有32位地址空间, 一般还是设置0吧, 我没有也不想尝试将它设置超过0的情况.
4) 低位文件大小
   这个还是可以进行设置的, 不过为了让其他共享用户知道你申请的文件映射的相关信息, 我使用的时候是在获得的地址空间头部添加一个结构化描述信息, 记录内存映射的大小, 名称等, 这样实际申请的空间就比输入的增加了一个头信息结构大小了, 我认为这样类似BSTR的方式应该是比较合理的.

5) 共享内存名称
   这个就是我今天测试的时候碰壁的祸根, 因为为了对于内存进行互斥访问, 我设置了一个互斥句柄, 而名称我选择和命名共享内存同名, 之下就是因为他们使用共同的namespace导致了错误, 呵呵.

7) 调用CreateFileMapping的时候GetLastError的对应错误
   ERROR_FILE_INVALID     如果企图创建一个零长度的文件映射, 应有此报
   ERROR_INVALID_HANDLE   如果发现你的命名内存空间和现有的内存映射, 互斥量, 信号量, 临界区同名就麻烦了
   ERROR_ALREADY_EXISTS   表示内存空间命名已经存在

8) 相关服务或者平台的命名保留
   Terminal Services:
   命名可以包含 "Global/" 或者 "Local/" 前缀在全局或者会话名空间初级文件映射. 其他部分可以包含任何除了(/)以外的字符, 可以参考 Kernel Object Name Spaces.

   Windows 2000 or later:
   如果 Terminal Services 没有运行 "Global/" 和 "Local/" 前缀的特殊含义就被忽略了

Windows API一日一练(59)CreateFileMapping和MapViewOfFile函数

在开发软件过程里,也经常碰到进程间共享数据的需求。比如A进程创建计算数据,B进程进行显示数据的图形。这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开发,加快...
  • caimouse
  • caimouse
  • 2007年10月27日 22:33
  • 51496

VC读取大文件之创建文件映射及文件写入效率测试

文件太大,没法一次读取到内存进行操作?Windows提供了内存映射API来读取大文件,与普通文件读取相比,内存映射效率比较高。 从代码层面上看,从硬盘上将文件读入内存,都要经过文件系统进行数据拷贝,并...
  • mfcing
  • mfcing
  • 2015年02月11日 15:35
  • 4400

CreateFileMapping的MSDN翻译和使用心得

 测试创建和打开文件映射的时候老是得到"句柄无效"的错误, 仔细看了MSDN以后才发觉是函数认识不透, 这里把相关的解释翻译出来HANDLE CreateFileMapping(  HANDLE hF...
  • lastsweetop
  • lastsweetop
  • 2009年01月19日 10:08
  • 875

MSDN的翻译是自动的, 还是人工的?

 script language="javascript">   var sortType=1;   function sortByCol(colNum)   ...{      var parNod...
  • cjcgy
  • cjcgy
  • 2008年03月27日 09:38
  • 393

MSDN 中文网站的某些翻译简直让人抓狂

MSDN 中文网站的某些翻译简直让人抓狂,要不是有英文链接,真的理解不了什么叫做“仪表化” -_-!!中文页面:https://www.microsoft.com/china/MSDN/libra...
  • inelm
  • inelm
  • 2006年04月09日 09:20
  • 263

CreateFileMapping()的使用心得

测试创建和打开文件映射的时候老是得到"句柄无效"的错误, 仔细看了MSDN以后才发觉是函数认识不透, 这里把相关的解释翻译出来HANDLE CreateFileMapping(HANDLE hFile...
  • khuang2008
  • khuang2008
  • 2009年03月02日 14:58
  • 19195

Windows API介绍及用法:CreateFileMapping和MapViewOfFile函数(进程间数据共享)

    在开发软件过程里,也经常碰到进程间共享数据的需求。比如A进程创建计算数据,B进程进行显示数据的图形。这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开...
  • dongzhiquan
  • dongzhiquan
  • 2010年04月20日 11:25
  • 2576

共享内存mmap()和CreateFileMapping()

共享内存是进程间的一种通信机制,而且它的作用不止于此。它的主要作用包括:提高I/O效率,匿名内存映射,内存共享进程通信。两个不同进程共享内存的意思是,同一快物理内存映射到该两个进程的进程地址空间。使用...
  • susershine
  • susershine
  • 2013年12月18日 22:42
  • 2539

内存共享CreateFileMapping用法

感觉这篇文章写得比较详细 CreateFileMapping的MSDN翻译和使用心得    测试创建和打开文件映射的时候老是得到"句柄无效"的错误, 仔细看了MSDN以后才发觉是函数认识不透...
  • xuqiang918
  • xuqiang918
  • 2014年09月19日 10:41
  • 1675

win7下使用共享内存方式CreateFileMapping返回GetLastError总是0x5的问题解决

在普通应用程序中使用共享内存方式创建内存共享对象时,CreateFileMapping函数总是返回句柄为NULL,通过GetLastError得到返回错误码 0x5, 问题解决: 使用Local 代...
  • coloriy
  • coloriy
  • 2015年07月29日 14:53
  • 2714
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CreateFileMapping的MSDN翻译和使用心得
举报原因:
原因补充:

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