2024年3月14日发(作者:)

CreateFileMapping的MSDN翻译和使用心得

测试创建和打开文件映射的时候老是得到"句柄无效"的错误, 仔细看了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) 低位文件大小

这个还是可以进行设置的, 不过为了让其他共享用户知道你申请的文件映射的相关信

息, 我使用的时候是在获得的地址空间头部添加一个结构化描述信息, 记录内存映射的大