现在的位置: 首页 > 综合 > 正文

c++中共享内存操作函数CreateFileMapping解析(一)

2013年10月04日 ⁄ 综合 ⁄ 共 1688字 ⁄ 字号 评论关闭

为指定的文件创建或者打开一个命名的或者非命名的文件映射对象。

HANDLE CreateFileMapping(

 HANDLE hFile,                       // handle to file

  LPSECURITY_ATTRIBUTESlpAttributes, // security

 DWORD flProtect,                    // protection

 DWORD dwMaximumSizeHigh,            // high-order DWORD of size

 DWORD dwMaximumSizeLow,             // low-order DWORD of size

 LPCTSTR lpName                      // object name

);

hFile:

指向创建映射对象的文件句柄。如果需要和物理文件关联,要确保物理文件创建的时候的访问模式和由flProtect参数指定的"保护标识"匹配,比如:物理文件只读, 内存映射需要读写就会发生错误。推荐你的物理文件使用独占方式创建。

       如果hFile为INVALID_HANDLE_VALUE,需要在dwMaximumSizeHigh和dwMaximumSizeLow中指定映射对象的大小。在这种情况下,CreateFileMapping由操作系统分页文件而不是由一个文件系统中的一个命名的文件创建一个指定大小的文件对象。文件映射对象可以同过复制,继承或者命名得到。

 

lpAttributes:

指向一个SECURITY_ATTRIBUTES结构体,决定是否被子进程继承。如果为NULL,句柄不能被继承,一般设置成NULL。

 

flProtect:

       当文件映射的时候,需要此参数设置保护标识。

描述

PAGE_READONLY

只有读的权限,那些试图写或者执行的操作都是非法的

PAGE_READWRITE

同时有读和写的权限

PAGE_WRITEONLY

只有写的权限

 

dwMaximumSizeHigh:

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

dwMaximumSizeLow

       文件映射对象的最大值的低位(DWORD),如果dwMaximumSizeHigh为0,文件映射对象的最大值为由hFile标识的文件的大小。

 

lpName

       指定文件映射对象的名称。

如果这个参数匹配一个存在的命名映射对象,这个函数用flProtect的访问权限请求访问这个存在的映射对象。

如果参数为NULL,创建一个未命名的映射对象。

如果参数名称匹配存在的事件、信号量、互斥、等待时间或者工作对象,函数返回失败,GetLastError函数会返回ERROR_INVALID_HANDLE。因为这些对象共用相同的命名空间。

 

返回值

       如果函数返回成功,,返回值为文件对象句柄;如果这个对象在调用此函数的时候已经存在,函数返回这个存在的句柄(大小为现在的大小),GetLastError函数会返回ERROR_ALREADY_EXISTS。

 

说明

       在文件映射对象创建之后,文件大小不要超过文件映射对象的大小,并不是所有的文件内容适合共享。

       如果应用指定的文件映射对象的大小超过实际的文件大小,硬盘上的文件增大去匹配指定的文件映射对象大小。如果文件不能增大,则会创建文件映射对象失败。GetLastError函数会返回ERROR_DISK_FULL。

       CreateFileMapping返回句柄有所有对文件对象句柄访问权限。

 

例子

       执行一个映射对象创建函数,如果这个对象已经存在,则函数执行失败。可以用以下代码判断:

       hMap= CreateFileMapping(...);

if (hMap != NULL&& GetLastError() == ERROR_ALREADY_EXISTS)

{

           CloseHandle(hMap);

           hMap = NULL;

}

return hMap;


 

抱歉!评论已关闭.