Создание именованной, совместно используемой памяти


Отображенные в памяти файлы, которые резервируются системным файлом подкачки, могут использоваться несколькими процессами, чтобы совместно использовать данные.

Первый процесс

Первый процесс создает объект "проекция файла" при помощи вызова функции 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);
}

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz