Отображенные в памяти файлы, которые резервируются системным файлом подкачки, могут использоваться несколькими процессами, чтобы совместно использовать данные.
Первый процесс создает объект "проекция файла" при помощи вызова функции CreateFileMapping с INVALID_HANDLE_VALUE и именем для объекта. Используя флажок PAGE_READWRITE, процесс будет иметь разрешение чтения - записи в память через посредство любых представлений данных файла, которые создаются.
Процесс затем использует дескриптор объекта "проекция файла", возвращенный CreateFileMapping при вызове MapViewOfFile, чтобы создать представление файла в адресном пространстве процесса. Функция MapViewOfFile возвращает указатель на представление данных файла.
Когда процессу больше не нужен доступ к объекту "проекция файла в память", он должен вызвать функцию CloseHandle. Когда все дескрипторы закрыты, система может освободить секцию файла подкачки, используемого объектом.
#include <windows.h> #include <stdio.h> #include <conio.h> #define BUF_SIZE 256 TCHAR szName[]=TEXT("MyFileMappingObject"); TCHAR szMsg[]=TEXT("Message from first process"); void main() { HANDLE hMapFile; LPCTSTR pBuf; hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // использование файла подкачки NULL, // защита по умолчанию PAGE_READWRITE, // доступ к чтению/записи 0, // макс. размер объекта BUF_SIZE, // размер буфера szName); // имя отраженного в памяти объекта if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE) { printf("Не может создать отраженный в памяти объект (%d).\n", GetLastError()); return; } pBuf = (LPTSTR) MapViewOfFile(hMapFile, // дескриптор отраженного // в памяти объекта FILE_MAP_ALL_ACCESS, // разрешение чтения/записи 0, 0, BUF_SIZE); if (pBuf == NULL) { printf("Представление проецированного файла не возможно (%d).\n", GetLastError()); return; } CopyMemory((PVOID)pBuf, szMsg, strlen(szMsg)); getch(); UnmapViewOfFile(pBuf); CloseHandle(hMapFile); } |
Второй процесс может получить доступ к одним и тем же данным при помощи вызова функции OpenFileMapping с тем же самым именем, что и первый процесс. Он может затем использовать функцию MapViewOfFile, чтобы получить указатель на представление данных файла.
#include <windows.h> #include <stdio.h> #include <conio.h> #define BUF_SIZE 256 TCHAR szName[]=TEXT("MyFileMappingObject"); void main() { HANDLE hMapFile; LPCTSTR pBuf; hMapFile = OpenFileMapping( FILE_MAP_ALL_ACCESS, // доступ к чтению/записи FALSE, // имя не наследуется szName); // имя "проецируемого " объекта if (hMapFile == NULL) { printf("Невозможно открыть объект "проекция файла" (%d).\n", GetLastError()); return; } pBuf = MapViewOfFile(hMapFile, // дескриптор "проецируемого" объекта FILE_MAP_ALL_ACCESS, // разрешение чтения/записи 0, 0, BUF_SIZE); if (pBuf == NULL) { printf("Представление проецированного файла не возможно (%d).\n", GetLastError()); return; } MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK); UnmapViewOfFile(pBuf); CloseHandle(hMapFile); } |