Erstellen eines Shared Memory mit Namen

Zum Freigeben von Daten können mehrere Prozesse Speicherabbilddateien verwenden, die von der Auslagerungsdatei des Systems gespeichert werden.

Hinweis

Der Code in diesem Beispiel erfordert Administratorrechte zur Laufzeit.

Erster Prozess

Der erste Prozess erstellt das Dateizuordnungsobjekt durch Aufrufen der CreateFileMapping-Funktion mit INVALID_HANDLE_VALUE und einem Namen für das Objekt. Wenn das PAGE_READWRITE-Flag verwendet wird, ist der Prozess berechtigt, im Speicher über alle erstellten Dateiansichten zu lesen und zu schreiben.

Anschließend verwendet der Prozess das Handle des Dateizuordnungsobjeks, das CreateFileMapping durch einen Aufruf an MapViewOfFile zurückgibt, um im Prozessadressbereich eine Ansicht der Datei zu erstellen. Die MapViewOfFile-Funktion gibt einen Zeiger auf die Dateiansicht zurück, pBuf Anschließend verwendet der Prozess die CopyMemory-Funktion, um in die Ansicht eine Zeichenfolge zu schreiben, auf die andere Prozesse zugreifen können.

Indem dem Namen des Dateizuordnungsobjekts „Global\“ vorangestellt wird, können Prozesse miteinander kommunizieren, auch wenn sie sich in unterschiedlichen Sitzungen des Terminalservers befinden. Hierzu muss der erste Prozess über die Berechtigung SeCreateGlobalPrivilege verfügen.

Wenn der Prozess keinen Zugriff mehr auf das Dateizuordnungsobjekt benötigt, sollte er die Funktion CloseHandle aufrufen. Wenn alle Handles geschlossen sind, kann das System den Abschnitt der vom Objekt verwendeten Auslagerungsdatei freigeben.

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

Zweiter Prozess

Ein zweiter Prozess kann auf die Zeichenfolge zugreifen, die der erste Prozess in den freigegebenen Speicher geschrieben hat. Hierzu wird die OpenFileMapping-Funktion aufgerufen, die für das Zuordnungsobjekt denselben Namen wie der erste Prozess angibt. Anschließend kann der Prozess die MapViewOfFile -Funktion verwenden, um einen Zeiger auf die Dateiansicht pBuf abzurufen. Der Prozess kann diese Zeichenfolge wie jede andere Zeichenfolge anzeigen. In diesem Beispiel ist im angezeigten Nachrichtenfeld die vom ersten Prozess geschriebene Meldung „Nachricht vom ersten Prozess“ zu sehen.

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

Freigeben von Dateien und Arbeitsspeicher