Crear memoria compartida con nombre

Para compartir datos, varios procesos pueden usar archivos asignados a memoria que almacena el archivo de paginación del sistema.

Primer proceso

El primer proceso crea el objeto de asignación de archivos llamando a la función CreateFileMapping con INVALID_HANDLE_VALUE y un nombre para el objeto. Mediante el uso de la marca PAGE_READWRITE , el proceso tiene permiso de lectura y escritura en la memoria a través de las vistas de archivo que se crean.

A continuación, el proceso usa el identificador de objeto de asignación de archivos que CreateFileMapping devuelve en una llamada a MapViewOfFile para crear una vista del archivo en el espacio de direcciones del proceso. La función MapViewOfFile devuelve un puntero a la vista de archivo, pBuf. A continuación, el proceso usa la función CopyMemory para escribir una cadena en la vista a la que pueden acceder otros procesos.

El prefijo de los nombres de objeto de asignación de archivos con "Global\" permite que los procesos se comuniquen entre sí, incluso si se encuentran en diferentes sesiones de terminal Server. Esto requiere que el primer proceso tenga el privilegio SeCreateGlobalPrivilege .

Cuando el proceso ya no necesite acceso al objeto de asignación de archivos, debe llamar a la función CloseHandle . Cuando se cierran todos los identificadores, el sistema puede liberar la sección del archivo de paginación que usa el objeto.

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

Segundo proceso

Un segundo proceso puede acceder a la cadena escrita en la memoria compartida por el primer proceso llamando a la función OpenFileMapping especificando el mismo nombre para el objeto de asignación que el primer proceso. A continuación, puede usar la función MapViewOfFile para obtener un puntero a la vista de archivo, pBuf. El proceso puede mostrar esta cadena como lo haría con cualquier otra cadena. En este ejemplo, el cuadro de mensaje mostrado contiene el mensaje "Mensaje del primer proceso" escrito por el primer proceso.

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

Compartir archivos y memoria