Création d’une mémoire partagée nommée

Pour partager des données, plusieurs processus peuvent utiliser des fichiers mappés en mémoire que le fichier de mappage du système stocke.

Remarque

Le code de cet exemple nécessitera des privilèges administratifs au moment de l'exécution.

Premier processus

Le premier processus crée l'objet de mappage de fichiers en appelant la fonction CreateFileMapping avec INVALID_HANDLE_VALUE et un nom pour l'objet. En utilisant l'indicateur PAGE_READWRITE, le processus dispose de la permission de lecture/écriture sur la mémoire par le biais de toutes les vues de fichiers qui sont créées.

Le processus utilise ensuite la poignée de l'objet de mappage de fichier que CreateFileMapping renvoie lors d'un appel à MapViewOfFile pour créer une vue du fichier dans l'espace d'adressage du processus. La fonction MapViewOfFile renvoie un pointeur sur la vue du fichier, pBuf. Le processus utilise ensuite la fonction CopyMemory pour écrire une chaîne de caractères dans la vue à laquelle d'autres processus peuvent accéder.

Le fait de préfixer les noms des objets de mappage de fichiers par "Global" permet aux processus de communiquer entre eux, même s'ils se trouvent dans des sessions de serveur de terminal différentes. Pour ce faire, le premier processus doit disposer du privilège SeCreateGlobalPrivilege.

Lorsque le processus n'a plus besoin d'accéder à l'objet de mappage de fichier, il doit appeler la fonction CloseHandle. Lorsque tous les handles sont fermés, le système peut libérer la section du fichier de pagination utilisée par l'objet.

#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;
}

Deuxième processus

Un deuxième processus peut accéder à la chaîne écrite dans la mémoire partagée par le premier processus en appelant la fonction OpenFileMapping en spécifiant le même nom pour l'objet de mappage que le premier processus. Il peut ensuite utiliser la fonction MapViewOfFile pour obtenir un pointeur sur la vue du fichier, pBuf. Le processus peut afficher cette chaîne comme n'importe quelle autre chaîne. Dans cet exemple, la boîte de message affichée contient le message « Message du premier processus » écrit par le premier processus.

#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;
}

Partage des fichiers et de la mémoire