Membuat Memori Bersama Bernama
Untuk berbagi data, beberapa proses dapat menggunakan file peta memori yang disimpan dalam file pemetaan halaman sistem.
Catatan
Kode dalam contoh ini akan memerlukan hak istimewa administratif saat runtime.
Proses Pertama
Proses pertama membuat objek pemetaan file dengan memanggil fungsi CreateFileMapping dengan INVALID_HANDLE_VALUE dan nama untuk objek. Dengan menggunakan bendera PAGE_READWRITE , proses ini memiliki izin baca/tulis ke memori melalui tampilan file apa pun yang dibuat.
Kemudian proses menggunakan handle objek pemetaan file yang dikembalikan oleh CreateFileMapping untuk membuat tampilan file di ruang alamat proses dalam panggilan ke MapViewOfFile. Fungsi MapViewOfFile mengembalikan penunjuk ke tampilan file, pBuf
. Proses kemudian menggunakan fungsi CopyMemory untuk menulis string ke tampilan yang dapat diakses oleh proses lain.
Awalan nama objek pemetaan file dengan "Global\" memungkinkan proses untuk berkomunikasi satu sama lain bahkan jika mereka berada dalam sesi server terminal yang berbeda. Ini mengharuskan proses pertama harus memiliki hak istimewa SeCreateGlobalPrivilege.
Ketika proses tidak lagi memerlukan akses ke objek pemetaan file, proses tersebut harus memanggil fungsi CloseHandle. Ketika semua handel ditutup, sistem dapat membebaskan bagian dari file paging yang digunakan oleh objek.
#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;
}
Proses Kedua
Proses kedua dapat mengakses string yang ditulis ke memori bersama oleh proses pertama dengan memanggil fungsi OpenFileMapping yang menentukan nama yang sama untuk objek pemetaan sebagai proses pertama. Kemudian dapat menggunakan pBuf
Proses ini dapat menampilkan string ini seperti halnya string lainnya. Dalam contoh ini, kotak pesan yang ditampilkan berisi pesan "Pesan dari proses pertama" yang ditulis oleh proses pertama.
#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;
}