windows API 的共享内存使用PAGE_NOCAHE的示例
时间: 2024-10-26 15:16:57 浏览: 27
内存共享c#版.rar_C# 内存共享_c# 共享内存_c#内存共享_共享内存_内存使用
Windows API 中的共享内存可以使用 `CreateFileMapping` 和 `MapViewOfFile` 函数来创建和映射内存区域。当指定 `FILE_MAP_WRITE | FILE_MAP_READ | FILE_MAP_ALL_ACCESS` 权限,并设置页面属性为 `PAGE_NO_CACHE` 时,表示该内存区域将不会被缓存到物理内存中,通常用于需要快速访问数据但不希望被频繁交换的情况。
下面是一个简单的 C++ 示例:
```cpp
#include <windows.h>
#include <iostream>
LPVOID CreateNoCacheMapping(HANDLE hFile, DWORD dwFileSize)
{
DWORD flProtect = PAGE_NO_CACHE;
DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
LPVOID lpBaseAddress = nullptr;
if (hFile == INVALID_HANDLE_VALUE)
return nullptr;
if (CreateFileMapping(hFile, NULL, flProtect, 0, dwFileSize, L"ShareMemory"))
{
if (MapViewOfFile(hFile, dwDesiredAccess, 0, 0, dwFileSize))
{
lpBaseAddress = static_cast<BYTE*>(MapViewOfFile(hFile, dwDesiredAccess, 0, 0, dwFileSize));
if (lpBaseAddress)
{
std::cout << "Shared memory with NO CACHE created successfully.\n";
// ...后续操作
}
else
{
std::cerr << "Error mapping view of file.\n";
UnmapViewOfFile(lpBaseAddress);
}
}
else
{
std::cerr << "Error creating map view of file.\n";
CloseHandle(hFile);
}
}
else
{
std::cerr << "Error creating file mapping.\n";
}
return lpBaseAddress;
}
int main()
{
// 假设已经打开了一个文件句柄 hFile
HANDLE hFile = OpenFile(...);
// 文件大小 dwFileSize
DWORD dwFileSize = GetFileSize(hFile, NULL);
LPVOID sharedMem = CreateNoCacheMapping(hFile, dwFileSize);
if (sharedMem)
{
// 使用 sharedMem 对象处理数据...
UnmapViewOfFile(sharedMem); // 使用完毕后记得卸载映射
}
CloseHandle(hFile);
return 0;
}
```
在这个例子中,`CreateFileMapping` 创建了一个只读写、无缓存的内存映射,然后通过 `MapViewOfFile` 映射到进程地址空间。记住,在完成后使用 `UnmapViewOfFile` 取消映射,释放资源。
阅读全文