共享内存C++

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CreateFileMapping函数

CreateFileMapping函数:创建或者打开一个指定内存中已命名或者未命名的文件映射对象

HANDLE WINAPI CreateFileMapping(

_in HANDLE hFile,

_in_opt LPSECURITY_ATTRIBUTES lpAttributes,

_in DWORD flProtect,

_in DWORD dwMaximumSizeHigh,

_in DWORD dwMaximumSizeLow,

_in_opt LPCTSTR lpName

);

参数说明:

hFile[in]

句柄文件,从该句柄中创建一个文件映射对象。

打开该文件时必须获得访问权限,访问权限由保护标志参数flProtect来设置。

如果hFile参数值为INV ALID_HANDLE_V ALUE的话,还得在dwMaximumSizeHigh参数和dwMaximumSizeLow参数中指定映射文件对象的大小。在这种情况下创建的是一个指定大小的文件映射对象,创建的文件映射对象在系统的分页文件中,而不是文件系统中的文件。

lpAttribute[in,option]

一个指向SECURITY_ATTRIBUTES结构体的指针,该指针指定返回的句柄是否可以被子进程继承。在SECURITY_ATTRIBUTES结构体中的lpSecurityDescriptor成员作为新的文件映射对象的安全描述符。

如果lpAttribute为NULL,返回句柄不能被子进程继承,文件映射对象获取默认的安全描述符。文件映射对象中默认安全描述符的访问控制列表时来自于生成器中的主令牌或者模拟令牌。

flProtect [in]

指定文件映射对象的页保护标志。所有对象的映射视图必须与该保护位兼容。

一个应用程序可以结合前面的页面保护值,指定一个或多个下表中的值给文件映射对象

dwMaximumSizeHigh[in]

文件映射对象最大值的DWORD高位

dwMaximumSizeLow[in]

文件映射对象最大值的DWORD低位

如果dwMaximumSizeLow和dwMaximumSizeHigh参数都为0,则文件映射对象的大小与hFile定义的文件大小一样。

如果映射一个长度为0的文件会产生ERROR_FILE_INV ALID错误码。应用程序应该检测那些长度为0的文件,并拒绝这些文件的访问。

lpName [in,optional]

文件映射对象的名称。

如果这个参数匹配到了一个存在的映射对象,函数会通过flProtect指定的保护等级请求访问该对象。

如果该参数为NULL,则创建一个没有名称的文件映射对象

如果lpName的值与某个事件、信号、定时器等名称相匹配,则函数调用失败。且GetLastError函数返回值为ERROR_INV ALID_HANDLE。发生这个现象的原因是共享了同一个名称空间。

返回值:

如果函数调用成功,返回一个新创建的文件映射对象的句柄。

如果要创建的文件映射对象在函数调用前就已经存在,函数返回该存在对象的

句柄(大小由存在对象来指定,而不是调用函数来指定),另外,GetLastError 返回ERROR_ALREADY_EXISTS值。

如果函数调用失败,返回值为NULL,要获取其它错误信息,可以调用GetLastError。

备注:

创建完文件映射对象后,文件大小不能超过文件映射对象的大小;如果超过文件映射大小的话,有一部分内容无法共享。

如果一个应用指定文件映射对象的大小要大于硬盘中实际指定文件的大小,并且页保护允许写权限(也就是说,flProtect参数值为PAGE_READWRITE或者是PAGE_EXECUTE_READWRITE)。在磁盘中的文件大小会增加,以匹配文件映射对象所指定的大小。如果文件扩展了的话,增加部分的内存值不能保证为0,它的值由文件系统决定。如果磁盘中的文件大小无法增加,CreateFileMappi调用失败,GetLastError返回ERROR_DISK_FULL。

依赖于操作系统分页文件的文件映射对象内的内容初始化值为0。CreateFileMapping函数的返回句柄对一个新的文件映射对象具有完全访问权限,并且可以给任何需要文件映射对象句柄的函数使用。

多进程可以共享同一文件视图,它既可以给单一文件影射对象使用,也可以给创建该单一文件映射对象的进程使用。单一文件映射对象可以由多个进程共享,这些进程通过在创建进程时继承句柄、复制句柄、或打开文件映射对象的名字来访问映射文件对象。

创建一个文件映射对象并不是将视图映射到进程地址空间中。而是通过MapViewOfFile和MapViewOfFileEx函数来映射文件到进程地址空间。

一个被映射的文件和获得访问权限的文件通过input和output函数(ReadFile和WriteFile)来访问。访问函数并不需要相关联。

一个文件映射对象的映射视图保证对象的内部关联,文件映射对象并不会关闭,除非所有关联都被释放了。因此,要完全关闭一个文件映射对象,应用程序需要unmap文件映射对象的所有映射视图(通过调用UnmapViewOfFile函数),并关闭文件映射视图的句柄(通过调用CloseHandle函数)。调用这两个函数并不需要按顺序来。

MapViewOfFile函数

将一个文件映射对象的视图映射到调用进程的地址空间中。

语法:

LPVOID WINAPI MapViewOfFile(

_in HANDLE hFileMappingObject,

_in DWORD dwDesiredAccess,

_in DWORD dwFileOffsetHigh,

_in DWORD dwFileOffsetLow,

相关文档
最新文档