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;
}
Zugehörige Themen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für