CreateFileMapping
函数是Windows操作系统中用于创建文件映射对象的API函数,文件映射对象允许多个进程共享一个文件或磁盘上的一组相关数据,从而实现数据的高效访问和处理。CreateFileMapping
函数的原型如下:
HANDLE CreateFileMapping( HANDLE hFile, LPSECURITY_ATTRIBUTES lpAttributes, DWORD flProtect, SIZE_T dwMaximumSizeHigh, SIZE_t dwMaximumSizeLow, LPCWSTR lpName);
参数说明:
1. hFile
:已打开的文件句柄,通常使用CreateFile
函数创建的HANDLE
,如INVALID_HANDLE_VALUE
表示使用默认的安全属性。
2. lpAttributes
:指向安全属性结构的指针,该结构决定了新映射对象的安全级别,如果设置为NULL,则使用默认的安全级别。
3. flProtect
:指定映射对象的保护类型,可以是以下值之一:
* PAGE_READONLY
:只读访问,这是默认值。
* PAGE_READWRITE
:读写访问。
* PAGE_EXECUTE_READWRITE
:可执行读写访问,这种访问级别要求映射对象关联的文件具有可执行权限。
4. dwMaximumSizeHigh
:映射对象的最大大小的高位部分,仅当flProtect
包含PAGE_WRITECOPY
或PAGE_EXECUTE_READCOPY
时有效,如果设置为0,则使用系统允许的最大大小。
5. dwMaximumSizeLow
:映射对象的最大大小的低位部分,仅当flProtect
包含PAGE_WRITECOPY
或PAGE_EXECUTE_READCOPY
时有效,如果设置为0,则使用系统允许的最大大小。
6. lpName
:映射对象的名称,如果设置为NULL,系统将自动生成一个唯一的名称。
使用示例:
include <Windows.h> include <iostream> int main() { HANDLE hFile = CreateFile(L"example.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { std::cerr << "无法打开文件" << std::endl; return 1; } HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, L"ExampleMapping"); if (hMapFile == NULL) { std::cerr << "无法创建文件映射对象" << std::endl; CloseHandle(hFile); return 1; } SIZE_T fileSize = GetFileSize(hFile, NULL); char* pBuffer = new char[fileSize]; BOOL result = ReadFile(hFile, pBuffer, fileSize, NULL, NULL); if (!result) { std::cerr << "读取文件失败" << std::endl; CloseHandle(hMapFile); CloseHandle(hFile); delete[] pBuffer; return 1; } HANDLE hMapView = CreateFileMapping(hMapFile, NULL, PAGE_READWRITE, 0, fileSize, NULL); if (hMapView == NULL) { std::cerr << "无法创建映射视图" << std::endl; CloseHandle(hMapFile); CloseHandle(hFile); delete[] pBuffer; return 1; } memset(pBuffer, 'A', fileSize); // 将缓冲区填充为'A'字符以测试映射视图的功能性,您可以在这里执行其他操作。 BOOL result = WriteFile(hMapView, pBuffer, fileSize, NULL, NULL); if (!result) { std::cerr << "写入映射视图失败" << std::endl; CloseHandle(hMapView); CloseHandle(hMapFile); DeleteFileMapping(hMapFile, hMapView); // 如果写入失败,需要删除映射视图以避免泄漏,但在某些情况下(例如内存不足),可能无法删除映射视图,在这种情况下,程序可能会崩溃,请确保正确处理异常情况。 CloseHandle(hFile); // 在删除映射视图后关闭文件句柄,这是因为在调用DeleteFileMapping之前不能关闭文件句柄,否则会导致错误,同样要注意处理异常情况。 delete[] pBuffer; // 在删除映射视图后释放缓冲区内存,这是因为在调用DeleteFileMapping之前不能释放缓冲区内存,否则会导致错误,同样要注意处理异常情况。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/133588.html