温馨提示×

Windows中怎么使用CreateFileMapping

小亿
141
2023-08-03 13:29:08
栏目: 编程语言

在Windows中,可以使用CreateFileMapping函数来创建文件映射。

CreateFileMapping函数的原型如下:

HANDLE CreateFileMapping(
HANDLE                hFile,
LPSECURITY_ATTRIBUTES lpAttributes,
DWORD                 flProtect,
DWORD                 dwMaximumSizeHigh,
DWORD                 dwMaximumSizeLow,
LPCTSTR               lpName
);

参数说明:

  • hFile: 要映射到文件的句柄。可以是一个已经打开的文件句柄,也可以是INVALID_HANDLE_VALUE,表示创建一个新的文件映射。

  • lpAttributes: 指向SECURITY_ATTRIBUTES结构体的指针,用于控制文件映射对象的安全性。可以传入NULL。

  • flProtect: 指定内存映射对象的访问保护属性。可以使用PAGE_READONLY、PAGE_READWRITE等常量。

  • dwMaximumSizeHigh: 文件映射对象的最大尺寸的高位DWORD值。一般为0。

  • dwMaximumSizeLow: 文件映射对象的最大尺寸的低位DWORD值。可以指定文件大小,也可以为0表示映射整个文件。

  • lpName: 文件映射对象的名称。可以传入NULL。

CreateFileMapping函数的返回值是一个表示文件映射对象的句柄。可以使用这个句柄来访问和操作文件映射。

创建文件映射对象后,可以使用MapViewOfFile函数将文件映射到进程的地址空间中,然后就可以通过访问这块内存来读写文件内容。

示例代码如下:

#include <windows.h>
#include <iostream>
int main() {
HANDLE hFile = CreateFile(
"test.txt",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
std::cout << "Failed to open file." << std::endl;
return 1;
}
HANDLE hMapping = CreateFileMapping(
hFile,
NULL,
PAGE_READWRITE,
0,
0,
NULL
);
if (hMapping == NULL) {
std::cout << "Failed to create file mapping." << std::endl;
CloseHandle(hFile);
return 1;
}
LPVOID lpBaseAddress = MapViewOfFile(
hMapping,
FILE_MAP_ALL_ACCESS,
0,
0,
);
if (lpBaseAddress == NULL) {
std::cout << "Failed to map view of file." << std::endl;
CloseHandle(hMapping);
CloseHandle(hFile);
return 1;
}
// 在这里可以通过访问lpBaseAddress指向的内存来读写文件内容
UnmapViewOfFile(lpBaseAddress);
CloseHandle(hMapping);
CloseHandle(hFile);
return 0;
}

以上示例代码创建了一个文件句柄hFile,并将其映射到文件映射对象hMapping中。然后使用MapViewOfFile函数将文件映射到进程的地址空间中,返回一个指向映射后内存的指针lpBaseAddress。通过访问lpBaseAddress指向的内存,可以读写文件内容。最后需要使用UnmapViewOfFile函数取消文件映射,并关闭文件映射对象和文件句柄。

0