在Windows中,可以使用CreateFileMapping函數(shù)來創(chuàng)建文件映射。
CreateFileMapping函數(shù)的原型如下:
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);
參數(shù)說明:
hFile: 要映射到文件的句柄??梢允且粋€已經打開的文件句柄,也可以是INVALID_HANDLE_VALUE,表示創(chuàng)建一個新的文件映射。
lpAttributes: 指向SECURITY_ATTRIBUTES結構體的指針,用于控制文件映射對象的安全性??梢詡魅隢ULL。
flProtect: 指定內存映射對象的訪問保護屬性。可以使用PAGE_READONLY、PAGE_READWRITE等常量。
dwMaximumSizeHigh: 文件映射對象的最大尺寸的高位DWORD值。一般為0。
dwMaximumSizeLow: 文件映射對象的最大尺寸的低位DWORD值??梢灾付ㄎ募笮?,也可以為0表示映射整個文件。
lpName: 文件映射對象的名稱。可以傳入NULL。
CreateFileMapping函數(shù)的返回值是一個表示文件映射對象的句柄??梢允褂眠@個句柄來訪問和操作文件映射。
創(chuàng)建文件映射對象后,可以使用MapViewOfFile函數(shù)將文件映射到進程的地址空間中,然后就可以通過訪問這塊內存來讀寫文件內容。
示例代碼如下:
#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;
}
以上示例代碼創(chuàng)建了一個文件句柄hFile,并將其映射到文件映射對象hMapping中。然后使用MapViewOfFile函數(shù)將文件映射到進程的地址空間中,返回一個指向映射后內存的指針lpBaseAddress。通過訪問lpBaseAddress指向的內存,可以讀寫文件內容。最后需要使用UnmapViewOfFile函數(shù)取消文件映射,并關閉文件映射對象和文件句柄。