溫馨提示×

Windows中怎么使用CreateFileMapping

小億
168
2023-08-03 13:29:08
欄目: 編程語言

在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ù)取消文件映射,并關閉文件映射對象和文件句柄。

0