Benoemd gedeeld geheugen maken
Als u gegevens wilt delen, kunnen meerdere processen gebruikmaken van geheugengebonden bestanden die in het paginabestand van het systeem worden opgeslagen.
Notitie
Voor de code in dit voorbeeld zijn tijdens runtime beheerdersbevoegdheden vereist.
Eerste proces
Het eerste proces maakt een bestandstoewijzingsobject door de functie CreateFileMapping aan te roepen met INVALID_HANDLE_VALUE en een naam voor het object. Door de vlag PAGE_READWRITE te gebruiken, heeft het proces lees-/schrijfmachtigingen voor het geheugen via bestandsweergaven die worden gemaakt.
Vervolgens gebruikt het proces de bestandstoewijzingsobjectgreep die CreateFileMapping retourneert in een aanroep naar MapViewOfFile om een weergave van het bestand te maken in de adresruimte van het proces. De functie MapViewOfFile retourneert een aanwijzer naar de bestandsweergave, pBuf
. Het proces gebruikt vervolgens de functie CopyMemory om een tekenreeks naar de weergave te schrijven die toegankelijk is voor andere processen.
Door de namen van bestandstoewijzingsobjecten vooraf te laten gaan met 'Globaal', kunnen processen met elkaar communiceren, zelfs als ze zich in verschillende terminalserversessies bevinden. Hiervoor moet het eerste proces de SeCreateGlobalPrivilege bevoegdheid hebben.
Wanneer het proces geen toegang meer nodig heeft tot het bestandstoewijzingsobject, moet het de CloseHandle--functie aanroepen. Wanneer alle handvatten zijn gesloten, kan het systeem de sectie van het wisselbestand die door het object wordt gebruikt, vrijmaken.
#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;
}
Tweede proces
Een tweede proces heeft toegang tot de tekenreeks die is geschreven naar het gedeelde geheugen door het eerste proces aan te roepen door de OpenFileMapping-functie aan te roepen die dezelfde naam opgeeft voor het toewijzingsobject als het eerste proces. Vervolgens kan de functie MapViewOfFile worden gebruikt om een aanwijzer naar de bestandsweergave te verkrijgen, pBuf
. In het proces kan deze tekenreeks worden weergegeven zoals elke andere tekenreeks. In dit voorbeeld bevat het weergegeven berichtenvenster de melding 'Bericht van het eerste proces' dat is geschreven door het eerste proces.
#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;
}