一、内存映射
- 创建内存映射并写入和读取数据
int sharedMemory()
{
string strMapName("ShareMemory");
string strComData("This is common data!");
LPVOID pBuffer = nullptr;
HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, (LPCWSTR)strMapName.c_str());
if (NULL == hMap)
{
hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, strComData.length() + 1, (LPCWSTR)strMapName.c_str());
if (hMap) {
pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
strcpy((char*)pBuffer, strComData.c_str());
cout << "写入共享内存数据:" << (char*)pBuffer << endl;
}
}
else
{
if (hMap) {
pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
cout << "读取共享内存数据:" << (char*)pBuffer << endl;
}
}
getchar();
if (pBuffer != nullptr) {
::UnmapViewOfFile(pBuffer);
}
if (NULL != hMap) {
::CloseHandle(hMap);
}
system("pause");
return 0;
}
- 创建文件映射,并写入数据
void fileMapping()
{
string strMapName("ShareMemory");
TCHAR* filePath = L"D:\\test.txt";
LPVOID pBuffer = nullptr;
HANDLE fileH = CreateFile(filePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW | TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (fileH == INVALID_HANDLE_VALUE)
{
cout << "Error in CreateFile! " << GetLastError() << endl;
return;
}
HANDLE MapFileH = CreateFileMapping(fileH, NULL, PAGE_READWRITE, 0, 1024, (LPCWSTR)strMapName.c_str());
if (MapFileH == NULL)
{
cout << "Error in CreateFileMapping! " << GetLastError() << endl;
return;
}
HANDLE OpenMapH = OpenFileMapping(FILE_MAP_ALL_ACCESS, true, (LPCWSTR)strMapName.c_str());
if (OpenMapH == NULL)
{
cout << "Error in OpenFileMapping! " << GetLastError() << endl;
return;
}
pBuffer = ::MapViewOfFile(OpenMapH, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (pBuffer) {
strcpy((char*)pBuffer, "test file mapping\n");
}
if (nullptr != pBuffer) {
UnmapViewOfFile(pBuffer);
}
if (NULL != OpenMapH) {
::CloseHandle(OpenMapH);
}
if (NULL != fileH) {
::CloseHandle(fileH);
}
}