c++中共享内存操作函数CreateFileMapping解析(一)
2012-03-19 09:21
796 查看
为指定的文件创建或者打开一个命名的或者非命名的文件映射对象。
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:
当文件映射的时候,需要此参数设置保护标识。
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;
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 | 只有写的权限 |
文件映射对象的最大值的高位(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;
相关文章推荐
- c++中共享内存操作函数MapViewOfFile解析(二)
- [转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- Win2000共享内存 CreateFileMapping的函数参数说明
- Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- c++中共享内存操作函数解析(三)
- Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- CreateFileMapping实现的共享内存及用法
- CreateFileMapping实现的共享内存及用法
- 使用文件映射的方式进行共享数据中CreateFileMapping、MapViewOfFile函数参数说明
- 内存共享函数OpenFileMapping,在release模式下返回NULL
- 共享内存mmap()和CreateFileMapping()
- [转载]转:CreateFileMapping实现的共享内存及用法
- [VB.NET]有人用过API CreateFileMapping 内存共享 没有?能后给段例子?
- CreateFileMapping实现的共享内存及用法
- 两个程序 通过共享内存 传递数据 CreateFileMapping
- CreateFileMapping在N个进程间共享一个HWND类型内存
- CreateFileMapping实现的共享内存及用法
- CreateFileMapping映射共享内存
- <Win32 API> CreateFileMapping 共享内存