Creazione di memoria condivisa denominata

Per condividere i dati, più processi possono usare i file mappati alla memoria archiviati dal file di paging del sistema.

Primo processo

Il primo processo crea l'oggetto di mapping dei file chiamando la funzione CreateFileMapping con INVALID_HANDLE_VALUE e un nome per l'oggetto. Usando il flag di PAGE_READWRITE , il processo dispone dell'autorizzazione di lettura/scrittura per la memoria tramite tutte le visualizzazioni di file create.

Il processo usa quindi l'handle dell'oggetto di mapping dei file restituito da CreateFileMapping in una chiamata a MapViewOfFile per creare una visualizzazione del file nello spazio indirizzi del processo. La funzione MapViewOfFile restituisce un puntatore alla visualizzazione file, pBuf. Il processo usa quindi la funzione CopyMemory per scrivere una stringa nella visualizzazione a cui è possibile accedere da altri processi.

Il prefisso dei nomi degli oggetti di mapping dei file con "Global\" consente ai processi di comunicare tra loro anche se si trovano in diverse sessioni del server terminale. Ciò richiede che il primo processo abbia il privilegio SeCreateGlobalPrivilege .

Quando il processo non deve più accedere all'oggetto di mapping dei file, deve chiamare la funzione CloseHandle . Quando tutti gli handle vengono chiusi, il sistema può liberare la sezione del file di paging usato dall'oggetto.

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>

#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process.");

int _tmain()
{
   HANDLE hMapFile;
   LPCTSTR pBuf;

   hMapFile = CreateFileMapping(
                 INVALID_HANDLE_VALUE,    // use paging file
                 NULL,                    // default security
                 PAGE_READWRITE,          // read/write access
                 0,                       // maximum object size (high-order DWORD)
                 BUF_SIZE,                // maximum object size (low-order DWORD)
                 szName);                 // name of mapping object

   if (hMapFile == NULL)
   {
      _tprintf(TEXT("Could not create file mapping object (%d).\n"),
             GetLastError());
      return 1;
   }
   pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object
                        FILE_MAP_ALL_ACCESS, // read/write permission
                        0,
                        0,
                        BUF_SIZE);

   if (pBuf == NULL)
   {
      _tprintf(TEXT("Could not map view of file (%d).\n"),
             GetLastError());

       CloseHandle(hMapFile);

      return 1;
   }


   CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
    _getch();

   UnmapViewOfFile(pBuf);

   CloseHandle(hMapFile);

   return 0;
}

Secondo processo

Un secondo processo può accedere alla stringa scritta nella memoria condivisa dal primo processo chiamando la funzione OpenFileMapping specificando lo stesso nome per l'oggetto di mapping del primo processo. Può quindi usare la funzione MapViewOfFile per ottenere un puntatore alla visualizzazione file, pBuf. Il processo può visualizzare questa stringa come sarebbe qualsiasi altra stringa. In questo esempio, la finestra di messaggio visualizzata contiene il messaggio "Messaggio dal primo processo" scritto dal primo processo.

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#pragma comment(lib, "user32.lib")

#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");

int _tmain()
{
   HANDLE hMapFile;
   LPCTSTR pBuf;

   hMapFile = OpenFileMapping(
                   FILE_MAP_ALL_ACCESS,   // read/write access
                   FALSE,                 // do not inherit the name
                   szName);               // name of mapping object

   if (hMapFile == NULL)
   {
      _tprintf(TEXT("Could not open file mapping object (%d).\n"),
             GetLastError());
      return 1;
   }

   pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
               FILE_MAP_ALL_ACCESS,  // read/write permission
               0,
               0,
               BUF_SIZE);

   if (pBuf == NULL)
   {
      _tprintf(TEXT("Could not map view of file (%d).\n"),
             GetLastError());

      CloseHandle(hMapFile);

      return 1;
   }

   MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);

   UnmapViewOfFile(pBuf);

   CloseHandle(hMapFile);

   return 0;
}

Condivisione di file e memoria