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