他のすべてのプロセスが共有する共有メモリプールを作成してデータを共有したいのですが、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. Facebook SDKでカスタム共有ボタンを作成する方法
- 3. JavaScriptでウィンドウとフレームの間でデータを共有する方法
- 4. 共有IEqualityComparerを作成する
- 5. PHPを使用してメモリ内に共有オブジェクトを作成する方法は?
- 6. テキストファイルを作成して共有ディレクトリに保存する方法は?
- 7. Facebookのワンクリックでコンテンツを共有するボタンを作成する方法は?
- 8. 共有部分をレールに編成する方法3
- 9. アプリを作成する方法AndroidでURLを「共有」できますか?
- 10. スタティックライブラリと共有C++ライブラリの両方を作成する
- 11. @MessageDrivenを使用してJMS 2共有サブスクリプションを作成する方法
- 12. JavaScriptを使ってFacebookの共有ダイアログを再作成する方法
- 13. 静的コンポーネントを作成してReactで共有する方法は?
- 14. Grails 2で共有ドメインのプロパティ/メソッドを作成/使用する方法は?
- 15. NerdDinnerの共有VB配列の初期値を作成する方法
- 16. Webアプリケーションからデスクトップ共有Web会議を作成する方法は?
- 17. Windowsウェブサーバーの管理共有からhtmlファイルを作成する方法
- 18. vbaで共通/共用インスタンスを作成する方法
- 19. C++:オブジェクトへの共有ポインタではなく、共有オブジェクトを作成する
- 20. ウィンドウを作成する前にウィンドウ枠の幅を取得する方法は?
- 21. 他人と共有するURLを作成するには
- 22. RSpecテストの共有サンプル内で共有サンプルを作成するために、コンテキスト内にコンテキストをネストする方法(すでに別のコンテキストにある)
- 23. どのようにGNUスクリーン共有を作成するには?
- 24. Google API - ドキュメントリスト - 共有リンクを作成
- 25. VBA - Outlook - 共有タスクリストでタスクを作成
- 26. wikiを共有する方法
- 27. Flash Screen(マルチユーザホワイトボード)を共有する方法
- 28. Windowsで共有操作をトリガする方法8
- 29. すぐに共有クラスを作成する
- 30. 共有ホスティングのphp.iniでmod_rewriteを有効にする方法
場合は、Boost.Interprocessを使用しています。 – GManNickG
確かにオプション〜 –
SEC_RESERVEオプションはコミットせずにアドレススペースを予約する必要がありますが、APIから解放できるように見えます。ありがとう、luskan。 – marcinj