本文共 2634 字,大约阅读时间需要 8 分钟。
文件映射对象是内核对象,它从系统的分页文件中获取一段内存。所有内核对象共享同一个名字空间,因此名称必须唯一。除了文件映射对象外,其他内核对象还包括事件、信号和互斥对象。
要创建一个文件映射对象,需要指定其大小和名称。Windows API CreateFileMapping用于实现这一点。该函数接收以下参数:
INVALID_HANDLE_VALUE:使用内核分页文件(共享内存)。NULL:默认安全属性。PAGE_READWRITE:允许读写访问。0 和 MAP_SIZE:用于指定文件映射的最大大小。FULL_MAP_NAME:文件映射对象的名称。如果创建失败,函数返回 NULL,并显示错误信息。
要对文件映射对象进行读写操作,使用 MapViewOfFile API。该函数接收以下参数:
FILE_MAP_ALL_ACCESS:允许读写访问。成功映射后,可以通过 memcpy_s 等函数进行读写操作。
以下是一个完整的示例代码:
// Prepare a message to be written to the view.PWSTR pszMessage = (PWSTR)MESSAGE;DWORD cbMessage = (wcslen(pszMessage) + 1) * sizeof(*pszMessage);HANDLE hMapFile = NULL;PVOID pView = NULL;// 创建文件映射对象hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 使用内核分页文件 NULL, // 默认安全属性 PAGE_READWRITE, // 允许读写访问 0, // 高位DWORD文件映射最大大小 MAP_SIZE, // 低位DWORD文件映射最大大小 FULL_MAP_NAME // 文件映射对象名称);if (hMapFile == NULL) { wprintf(L"CreateFileMapping failed w/err 0x%08lx\n", GetLastError()); goto Cleanup;}wprintf(L"The file mapping (%s) is created\n", FULL_MAP_NAME);// 将文件映射映射到当前进程的地址空间pView = MapViewOfFile( hMapFile, // 文件映射对象句柄 FILE_MAP_ALL_ACCESS, // 允许读写访问 0, // 高位DWORD文件偏移 VIEW_OFFSET, // 低位DWORD文件偏移 VIEW_SIZE // 要映射到视图的字节数);if (pView == NULL) { wprintf(L"MapViewOfFile failed w/err 0x%08lx\n", GetLastError()); goto Cleanup;}wprintf(L"The file view is mapped\n");// 将消息写入视图memcpy_s(pView, VIEW_SIZE, pszMessage, cbMessage);wprintf(L"This message is written to the view:\n\"%s\"\n", pszMessage); 以下是客户端代码示例:
HANDLE hMapFile = NULL;PVOID pView = NULL;// 打开已命名的文件映射对象hMapFile = OpenFileMapping( FILE_MAP_READ, // 只允许读取访问 FALSE, // 不继承名称 FULL_MAP_NAME // 文件映射对象名称);if (hMapFile == NULL) { wprintf(L"OpenFileMapping failed w/err 0x%08lx\n", GetLastError()); goto Cleanup;}wprintf(L"The file mapping (%s) is opened\n", FULL_MAP_NAME);// 将文件映射映射到当前进程的地址空间pView = MapViewOfFile( hMapFile, // 文件映射对象句柄 FILE_MAP_READ, // 只允许读取访问 0, // 高位DWORD文件偏移 VIEW_OFFSET, // 低位DWORD文件偏移 VIEW_SIZE // 要映射到视图的字节数);if (pView == NULL) { wprintf(L"MapViewOfFile failed w/err 0x%08lx\n", GetLastError()); goto Cleanup;}wprintf(L"The file view is mapped\n");// 从视图读取内容wprintf(L"Read from the file mapping:\n\"%s\"\n", (PWSTR)pView); 通过上述代码示例,可以实现文件映射对象的创建与使用。服务器代码创建并写入内容,客户端代码读取并显示内容。
转载地址:http://dlm.baihongyu.com/