2011-12-27 7 views
0

他のすべてのプロセスが共有する共有メモリプールを作成してデータを共有したいのですが、CreateFileMapping APIドキュメントを読んだあと、指定する必要があると混乱しました共有メモリのサイズ私は実際にそれが動的な割り当てとサービスのように見える無料であることを望みます。 createFileMappingを使って共有メモリを動的に処理する方法はありますか?ウィンドウに共有メモリプールを作成する方法

+2

場合は、Boost.Interprocessを使用しています。 – GManNickG

+0

確かにオプション〜 –

+0

SEC_RESERVEオプションはコミットせずにアドレススペースを予約する必要がありますが、APIから解放できるように見えます。ありがとう、luskan。 – marcinj

答えて

0

名前付き共有メモリの作成。

まずプロセス

最初のプロセスは、INVALID_HANDLE_VALUECreateFileMapping機能とオブジェクトの名前を呼び出すことにより、ファイルマッピングオブジェクトを作成します。 PAGE_READWRITEフラグを使用すると、プロセスは作成されたファイルビューを通じてメモリに対する読み取り/書き込みアクセス許可を持ちます。 その後、プロセスは、MapViewOfFileへの呼び出しでCreateFileMappingが返すファイルマッピングオブジェクトハンドルを使用して、プロセスアドレス空間にファイルのビューを作成します。 MapViewOfFile関数は、ファイルビューへのポインタ、pBufを返します。次に、プロセスはCopyMemory関数を使用して、他のプロセスがアクセスできる文字列をビューに書き込みます。

プロセス1つのコード:

#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工程

に対して同じ名前を指定OpenFileMapping関数を呼び出すことにより、第1のプロセスにより共有メモリに書き込まれた文字列にアクセスすることができる第二工程オブジェクトを最初のプロセスとしてマッピングします。次に、MapViewOfFile関数を使用して、ファイルビューへのポインタpBufを取得できます。プロセスは、この文字列を他の文字列と同じように表示できます。この例では、表示されるメッセージボックスには、最初のプロセスによって書き込まれたメッセージ「最初のプロセスからのメッセージ」が含まれています。

プロセス2コード:

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

出典:ブーストはあなたに利用可能であるhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx

関連する問題