他のすべてのプロセスが共有する共有メモリプールを作成してデータを共有したいのですが、CreateFileMapping APIドキュメントを読んだあと、指定する必要があると混乱しました共有メモリのサイズ私は実際にそれが動的な割り当てとサービスのように見える無料であることを望みます。 createFileMappingを使って共有メモリを動的に処理する方法はありますか?ウィンドウに共有メモリプールを作成する方法
答えて
名前付き共有メモリの作成。
まずプロセス
最初のプロセスは、INVALID_HANDLE_VALUE
とCreateFileMapping
機能とオブジェクトの名前を呼び出すことにより、ファイルマッピングオブジェクトを作成します。 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
- 1. 共有ライブラリ固有のシングルトンインスタンスを作成する方法
- 2. 複数のnpmリポジトリに共有package.jsonを作成する方法
- 3. 共有ライブラリのリストと共有ポイント2013の両方で動作するカスタムリボンボタンを作成する方法
- 4. メールで共有するバイト[]イメージを作成する方法
- 5. クライアントオブジェクトモデルを使用して共有カレンダーリストアイテムを作成する方法
- 6. オプションでクラスレベルのスコープで共有リストを作成する方法
- 7. Facebook SDKでカスタム共有ボタンを作成する方法
- 8. QT/QMLで共有ライブラリを作成する方法
- 9. 共有レルム内でプライベートレルムオブジェクトを作成する方法
- 10. php共有メッセージ用のインラインボタンを作成する方法
- 11. ウィンドウとLinuxの間でインターネットを共有する方法
- 12. JavaScriptでウィンドウとフレームの間でデータを共有する方法
- 13. Golangでメモリプールを実装する方法
- 14. 共有IEqualityComparerを作成する
- 15. LinkedIn共有ボタンを作成する
- 16. Gmail共有リンクを作成する
- 17. PHPを使用してメモリ内に共有オブジェクトを作成する方法は?
- 18. java sdkを使用してボックスに共有リンクを作成する方法
- 19. テキストファイルを作成して共有ディレクトリに保存する方法は?
- 20. Androidでテキストを共有するためのアプリピッカーを作成する方法は?
- 21. Facebookのワンクリックでコンテンツを共有するボタンを作成する方法は?
- 22. 同じIDを共有する複数のタブストラップを作成する方法
- 23. Docker共有ボリュームの作成
- 24. Oozie共有ライブラリの作成
- 25. 共有部分をレールに編成する方法3
- 26. アプリを作成する方法AndroidでURLを「共有」できますか?
- 27. 共有メッセージ電文ボットのインラインボタンの作成方法
- 28. marshmallowのデフォルト共有を使って共有する方法は?
- 29. RSpec変数を共有コンテキスト間で共有する方法は?
- 30. スタティックライブラリと共有C++ライブラリの両方を作成する
場合は、Boost.Interprocessを使用しています。 – GManNickG
確かにオプション〜 –
SEC_RESERVEオプションはコミットせずにアドレススペースを予約する必要がありますが、APIから解放できるように見えます。ありがとう、luskan。 – marcinj