Membuat Memori Bersama Bernama

Untuk berbagi data, beberapa proses dapat menggunakan file yang dipetakan memori yang disimpan file halaman sistem.

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 handel objek pemetaan file yang dikembalikan CreateFileMapping dalam panggilan ke MapViewOfFile untuk membuat tampilan file di ruang alamat proses. Fungsi MapViewOfFile mengembalikan penunjuk ke tampilan file, pBuf. Proses ini 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 halaman yang digunakan 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 fungsi MapViewOfFile untuk mendapatkan penunjuk ke tampilan file, 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;
}

Berbagi File dan Memori