名前付き共有メモリの作成
データを共有するために、複数のプロセスは、システム ページング ファイルに保存されているメモリ マップ ファイルを使用できます。
Note
この例のコードでは、実行時に管理特権が必要になります。
最初のプロセス
最初のプロセスでは、CreateFileMapping 関数を呼び出して、INVALID_HANDLE_VALUE とオブジェクトの名前を指定して、ファイル マッピング オブジェクトを作成します。 PAGE_READWRITE フラグを使用すると、プロセスには、作成されたすべてのファイル ビューを介してメモリに対する読み取り/書き込みアクセス許可が付与されます。
その後、プロセスは、CreateFileMapping が MapViewOfFile の呼び出しで返すファイル マッピング オブジェクト ハンドルを使用して、プロセス アドレス空間にファイルのビューを作成します。 MapViewOfFile 関数は、pBuf
ファイル ビューへのポインターを返します。 その後、プロセスは CopyMemory 関数を使用して、他のプロセスからアクセスできる文字列をビューに書き込みます。
ファイル マッピング オブジェクト名の前に「Global\」を付けると、プロセスが異なるターミナル サーバー セッションにある場合でも相互に通信できるようになります。 そのためには、最初のプロセスに SeCreateGlobalPrivilege 特権が必要です。
プロセスがファイル マッピング オブジェクトにアクセスする必要がなくなった場合は、CloseHandle 関数を呼び出す必要があります。 すべてのハンドルが閉じられると、システムはオブジェクトが使用するページング ファイルのセクションを解放できます。
#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;
}
2 番目のプロセス
2 番目のプロセスは、最初のプロセスと同じ名前をマッピング オブジェクトに指定する OpenFileMapping 関数を呼び出すことによって、最初のプロセスによって共有メモリに書き込まれた文字列にアクセスできます。 次に、MapViewOfFile 関数を使用して、 pBuf
ファイル ビューへのポインターを取得できます。 プロセスでは、他の任意の文字列と同様に、この文字列を表示できます。 この例では、表示されるメッセージ ボックスには、最初のプロセスによって書き込まれたメッセージ「最初のプロセスからのメッセージ」が含まれています。
#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;
}