vc++ 映射

HANDLE CreateFileMappingA(
  HANDLE                hFile,
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  DWORD                 flProtect,
  DWORD                 dwMaximumSizeHigh,
  DWORD                 dwMaximumSizeLow,
  LPCSTR                lpName
);

BOOL CloseHandle(
  HANDLE hObject
);

hFile

从中创建文件映射对象的文件句柄。必须使用与flProtect参数指定的保护标志兼容的访问权限来打开文件 。这不是必需的,但是建议您打开要映射的文件以进行独占访问。

如果hFileINVALID_HANDLE_VALUE,则调用过程还必须在dwMaximumSizeHigh和 dwMaximumSizeLow参数中指定文件映射对象的大小。在这种情况下, CreateFileMapping创建指定大小的文件映射对象,该文件映射对象是一个和物理文件大小无关的内存空间。

lpFileMappingAttributes

指向SECURITY_ATTRIBUTES 结构的指针,该结构确定子进程是否可以继承返回的句柄。SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员 为新文件映射对象指定安全描述符。不过一般设置NULL就可以了。

flProtect

指定文件映射对象的页面保护。对象的所有映射视图必须与此保护兼容。
此参数可以是常用值。
PAGE_EXECUTE_READ :允许将视图映射为只读,写时复制或执行访问。
PAGE_READONLY:只读,尝试写入特定区域会导致访问冲突。等效 PAGE_WRITECOPY
PAGE_READWRITE :允许读/写访问。
SEC_NOCACHE:将所有页面设置为不可缓存。除非设备明确要求,否则应用程序不应使用此属性。SEC_NOCACHE要求设置SEC_RESERVE或 SEC_COMMIT属性。
SEC_RESERVE :  hfile参数为INVALID_HANDLE_VALU,则指定当文件映射到进程地址空间时,将保留整个页面内容。

dwMaximumSizeHigh 和 dwMaximumSizeLow

文件映射对象最大大小的高阶DWORD (高32位)。
文件映射对象最大大小的低阶DWORD。
如这个两个参数都是零,就用磁盘文件的实际长度。

lpName   

文件映射对象的名称。
如果此参数与现有映射对象的名称匹配,则该函数使用flProtect指定的保护来请求访问该对象。
如果此参数为NULL,则创建的文件映射对象不带名称。
如果lpName与现有事件,信号量,互斥量,可等待计时器或作业对象的名称匹配,则该函数将失败

该名称可以具有“全局”或“本地”前缀,以在全局或会话名称空间中显式创建对象。名称的其余部分可以包含除反斜杠字符()之外的任何字符。从非零会话的会话在全局名称空间中创建文件映射对象需要SeCreateGlobalPrivilege 特权。

调用CreateFileMapping的时候可能会出现的  GetLastError   的相应错误:
ERROR_FILE_INVALID (错误_文件_无效)如果企图创建一个零长度的文件映射
ERROR_INVALID_HANDLE(错误_无效_处理) 内存空间的命名和现有的内存映射,互斥量,信号量,临界区有同名
ERROR_ALREADY_EXISTS (错误或已经存在)表示内存空间命名已经存在

返回值

如果函数成功,则返回值是新创建的文件映射对象的句柄。
如果对象在函数调用之前存在,则该函数将返回现有对象的句柄
如果函数失败,则返回值为NULL

//打开一个命名文件映射对象。
HANDLE OpenFileMappingA(
  DWORD  dwDesiredAccess,
  BOOL   bInheritHandle,
  LPCSTR lpName
);

dwDesiredAccess

对文件映射对象的访问。将根据目标文件映射对象上的任何安全描述符检查此访问。

bInheritHandle

如果此参数为TRUE,则由CreateProcess函数创建的进程 可以继承该句柄;否则,该句柄不能被继承。

lpName

要打开的文件映射对象的名称。如果使用该名称存在文件映射对象的打开句柄,并且映射对象上的安全描述符不与dwDesiredAccess参数冲突 ,则打开操作成功。该名称可以具有“ Global \”或“ Local \”前缀,以在全局或会话名称空间中显式打开对象。名称的其余部分可以包含除反斜杠字符(\)之外的任何字符。有关更多信息,请参见 内核对象命名空间。使用终端服务会话可实现快速的用户切换。第一个登录的用户使用会话0,下一个登录的用户使用会话1,依此类推。内核对象名称必须遵循为“终端服务”概述的准则,以便应用程序可以支持多个用户。

返回值

如果函数成功,则返回值是指定文件映射对象的打开句柄。
如果函数失败,则返回值为NULL。要获取扩展的错误信息,请调用GetLastError。

//将文件映射的视图映射到调用进程的地址空间。
LPVOID MapViewOfFile(
  HANDLE hFileMappingObject,
  DWORD  dwDesiredAccess,
  DWORD  dwFileOffsetHigh,
  DWORD  dwFileOffsetLow,
  SIZE_T dwNumberOfBytesToMap
);
//从调用进程的地址空间取消映射文件的映射视图。
BOOL UnmapViewOfFile(
  LPCVOID lpBaseAddress
);

hFileMappingObject

文件映射对象的句柄。该 的CreateFileMapping和 OpenFileMapping函数返回该句柄。

dwDesiredAccess

FILE_MAP_READ
FILE_MAP_WRITE

dwFileOffsetHigh

视图开始处的文件偏移量的高阶DWORD。

dwFileOffsetLow

视图开始处的文件偏移量的低阶DWORD。高偏移量和低偏移量的组合必须在文件映射中指定偏移量。它们还必须匹配系统的内存分配粒度。也就是说,偏移量必须是分配粒度的倍数。若要获取系统的内存分配粒度,请使用 GetSystemInfo函数,该函数将填充SYSTEM_INFO结构的成员。

dwNumberOfBytesToMap

映射到视图的文件映射的字节数。所有字节必须在CreateFileMapping指定的最大大小内。如果此参数为0(零),则映射将从指定的偏移量扩展到文件映射的末尾。

//下面说明创建一个名为MySharedMem的长度为4096字节的有名映射文件:
HANDLE hMySharedMapFile=CreateFileMapping((HANDLE)0xFFFFFFFF),
NULL,PAGE_READWRITE,0,4096,"MySharedMem");

//并映射缓存区视图:
LPSTR pszMySharedMapView=(LPSTR)MapViewOfFile(hMySharedMapFile,
FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

//其他进程访问共享对象,需要获得对象名并调用OpenFileMapping函数。
HANDLE hMySharedMapFile=OpenFileMapping(FILE_MAP_WRITE,
FALSE,"MySharedMem");
BOOL ReadFile(
  HANDLE       hFile,
  LPVOID       lpBuffer,
  DWORD        nNumberOfBytesToRead,
  LPDWORD      lpNumberOfBytesRead,
  LPOVERLAPPED lpOverlapped
);
BOOL WriteFile(
  HANDLE       hFile,
  LPCVOID      lpBuffer,
  DWORD        nNumberOfBytesToWrite,
  LPDWORD      lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped
);

hFile

设备的句柄(例如,文件,文件流,物理磁盘,卷,控制台缓冲区,磁带驱动器,套接字,通信资源,邮槽或管道)。

该HFILE参数必须已经具有读取权限创建。有关更多信息,请参见通用访问权限和 文件安全性和访问权限。

对于异步读取操作,hFile可以是CreateFile函数使用FILE_FLAG_OVERLAPPED标志 打开的任何句柄 ,或者是socket或 accept函数返回的套接字句柄 。

lpBuffer

指向缓冲区的指针,该缓冲区接收从文件或设备读取的数据。

该缓冲区必须在读取操作期间保持有效。在读取操作完成之前,调用者不得使用此缓冲区。

nNumberOfBytesToRead

要读取的最大字节数。

lpNumberOfBytesRead

指向变量的指针,该变量接收使用同步hFile参数时读取的字节 数。在执行任何工作或错误检查之前,ReadFile将此值设置为零。如果这是异步操作,请对该参数使用NULL以避免潜在的错误结果。

仅当lpOverlapped 参数不为NULL时,此参数才能为NULL。

lpOverlapped

如果hFILE参数是使用FILE_FLAG_OVERLAPPED打开的, 则需要指向OVERLAPPED结构的指针,否则可以为NULL。

如果使用FILE_FLAG_OVERLAPPED打开hFile,则 lpOverlapped参数必须指向有效且唯一的OVERLAPPED结构,否则该函数可能会错误地报告读取操作已完成。

对于支持字节偏移量的hFile,如果使用此参数,则必须指定一个字节偏移量,从该位置开始从文件或设备读取。通过设置OVERLAPPED结构的Offset和OffsetHigh成员 来指定此偏移量 。对于不支持字节偏移量的 hFile,将忽略Offset和 OffsetHigh。

有关lpOverlapped和 FILE_FLAG_OVERLAPPED的不同组合的更多信息,请参见“备注”部分和“ 同步和文件位置”部分。

返回值

如果函数成功,则返回值为非零(TRUE)。
如果函数失败或异步完成,则返回值为零(FALSE)。若要获取扩展的错误信息,请调用 GetLastError函数。

 

//复制对象句柄。
BOOL DuplicateHandle(
  HANDLE   hSourceProcessHandle,
  HANDLE   hSourceHandle,
  HANDLE   hTargetProcessHandle,
  LPHANDLE lpTargetHandle,
  DWORD    dwDesiredAccess,
  BOOL     bInheritHandle,
  DWORD    dwOptions
);

//为指定的文件创建或打开一个命名或未命名的文件映射对象,并为物理内存指定NUMA节点。
HANDLE CreateFileMappingNumaA(
  HANDLE                hFile,
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  DWORD                 flProtect,
  DWORD                 dwMaximumSizeHigh,
  DWORD                 dwMaximumSizeLow,
  LPCSTR                lpName,
  DWORD                 nndPreferred
);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值