新闻资讯
看你所看,想你所想

CreateFileMapping

CreateFileMapping

CreateFileMapping函式用于创建一个档案映射核心对象。

基本介绍

  • 中文名:CreateFileMapping
  • 头档案: Winbase.h
  • 创建:新的档案映射核心对象
  • Function :CreateFileMapping
  • ByVal:SECURITY_ATTRIBUTES

声明

Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long.
HANDLE WINAPI CreateFileMapping(_In_HANDLE hFile,_In_opt_LPSECURITY_ATTRIBUTES lpAttributes,_In_DWORD flProtect,_In_DWORD dwMaximumSizeHigh,_In_DWORD dwMaximumSizeLow,_In_opt_LPCTSTR lpName);

说明

创建一个新的档案映射核心对象。

返回值

Long,新建档案映射对象的句柄;零意味着出错。会设定GetLastError。即使函式成功,但倘若返回的句柄属于一个现成的档案映射对象,那幺GetLastError也会设定成ERROR_ALREADY_EXISTS。在这种情况下,档案映射的长度就是现有对象的长度,而不是这个函式指定的尺寸。

参数表

hFile:Long,指定欲在其中创建映射的一个档案句柄。0xFFFFFFFF(-1,即INVALID_HANDLE_VALUE)表示在页面档案中创建一个可共享的档案映射。
lpFileMappigAttributes:SECURITY_ATTRIBUTES,它指明返回的句柄是否可以被子进程所继承,指定一个安全对象,在创建档案映射时使用。如果为NULL(用ByVal As Long传递零),表示使用默认安全对象。
flProtect:Long,下述常数之一:
PAGE_READONLY 以唯读方式打开映射
PAGE_READWRITE 以可读、可写方式打开映射
PAGE_WRITECOPY 为写操作留下备份
可组合使用下述一个或多个常数:
SEC_COMMIT 为档案映射一个小节中的所有页分配记忆体
SEC_IMAGE 档案是个执行档
SEC_RESERVE 为没有分配实际记忆体的一个小节保留虚拟记忆体空间
dwMaximumSizeHigh:Long,档案映射的最大长度的高32位。
dwMaximumSizeLow:Long,档案映射的最大长度的低32位。如这个参数和dwMaximumSizeHigh都是零,就用磁碟档案的实际长度。
lpName:String,指定档案映射对象的名字。如存在这个名字的一个映射,函式就会打开它。用vbNullString可以创建一个无名的档案映射。
调用CreateFileMapping的时候可能会出现的GetLastError的相应错误:
ERROR_FILE_INVALID (错误_档案_无效)如果企图创建一个零长度的档案映射
ERROR_INVALID_HANDLE(错误_无效_处理) 记忆体空间的命名和现有的记忆体映射,互斥量,信号量,临界区有同名
ERROR_ALREADY_EXISTS (错误或已经存在)表示记忆体空间命名已经存在
在调用CreateFileMapping()时,可以用GetLastError()来检查其返回的错误信息。如果返回值为ERROR_ALREADY_EXISTS,则表示记忆体映射对象指定名字已经存在。有关其他返回值的意义见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,会导致错误。
6) 调用CreateFileMapping的时候GetLastError的对应错误
ERROR_FILE_INVALID 如果企图创建一个零长度的档案映射, 应有此报
ERROR_INVALID_HANDLE 如果发现你的命名记忆体空间和现有的记忆体映射, 互斥量,信号量,临界区同名就麻烦了
ERROR_ALREADY_EXISTS 表示记忆体空间命名已经存在
7) 相关服务或者平台的命名保留Terminal Services:
命名可以包含 "Global" 或者 "Local" 前缀在全局或者会话名空间初级档案映射。 其他部分可以包含任何除了()以外的字元, 可以参考 Kernel Object Name Spaces。

相关推荐

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:yongganaa@126.com