Share via


Erstellen von benanntem freigegebenem Arbeitsspeicher

Zum Freigeben von Daten können mehrere Prozesse speicherabbildete Dateien verwenden, die in der System-Auslagerungsdatei gespeichert werden.

Erster Prozess

Der erste Prozess erstellt das Dateizuordnungsobjekt, indem die CreateFileMapping-Funktion mit INVALID_HANDLE_VALUE und einem Namen für das Objekt aufgerufen wird. Durch Die Verwendung des PAGE_READWRITE-Flags verfügt der Prozess über Lese-/Schreibberechtigungen für den Arbeitsspeicher über alle erstellten Dateiansichten.

Anschließend verwendet der Prozess das Dateizuordnungsobjekthandle, das CreateFileMapping in einem Aufruf von MapViewOfFile zurückgibt, um eine Ansicht der Datei im Prozessadressraum zu erstellen. Die MapViewOfFile-Funktion gibt einen Zeiger auf die Dateiansicht zurück, pBuf. Der Prozess verwendet dann die CopyMemory-Funktion , um eine Zeichenfolge in die Ansicht zu schreiben, auf die andere Prozesse zugreifen können.

Das Präfix "Global\" für die Dateizuordnungsobjektnamen ermöglicht es Prozessen, miteinander zu kommunizieren, auch wenn sie sich in unterschiedlichen Terminalserversitzungen befinden. Dies erfordert, dass der erste Prozess über die Berechtigung SeCreateGlobalPrivilege verfügen muss.

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

#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 vom ersten Prozess in den freigegebenen Speicher geschrieben wird, indem die OpenFileMapping-Funktion aufgerufen wird, die den gleichen Namen für das Zuordnungsobjekt wie der erste Prozess angibt. Anschließend kann die MapViewOfFile-Funktion verwendet werden, um einen Zeiger auf die Dateiansicht zu erhalten. pBuf Der Prozess kann diese Zeichenfolge wie jede andere Zeichenfolge anzeigen. In diesem Beispiel enthält das angezeigte Meldungsfeld die Meldung "Nachricht vom ersten Prozess", die vom ersten Prozess geschrieben wurde.

#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