-1

私のプロジェクトではCreateFileMapping、2 つのプロセス間でメモリを共有するという概念を実装しました。特定の画像に関する詳細を含むセッション データのメモリ アドレスを格納するサーバー プロセスがあります。そして、バッファからそのアドレスを読み取るクライアント プロセスがあります。ここでの問題は、アドレスがクライアント プロセスに表示されることですが、一部の詳細が欠落しています。

これは私のサーバープロセスコードです:

HANDLE hMem;
LPCSTR  pBuf;
#define BUF_SIZE 1024
static const char MemoryName[]="Share Memory Name";

hMem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL, PAGE_READWRITE,0, BUF_SIZE, MemoryName);
pBuf = (LPCSTR) MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
CopyMemory((PVOID)pBuf, session, BUF_SIZE); 
LtEntity test = LtEntity(pBuf);

これは私のクライアント プロセス コードです。

HANDLE hMem;
LPCSTR  pBuf;
#define BUF_SIZE 1024
static const char MemoryName[]="Share Memory Name";

hMem = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, MemoryName);  
pBuf = (LPCSTR) MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);                   
LtEntity test = LtEntity(pBuf);

サーバー プロセスでは変数 "test" にすべての詳細が含まれていますが、クライアント "test" では一部のデータが欠落しています。

以下のサーバー テスト変数は、変数の内容を示す添付画像を示しています。

以下のクライアント テスト変数は、変数の内容を示す添付画像を示しています。

クライアントプロセスでも表示されるアイテムデータが必要な違いを確認してください..

4

3 に答える 3

1

一部の詳細が欠落しています

もう一度言うことができます。の定義はLtEntity?

ファイル マッピングに埋め込みポインタが含まれていますか? 共有メモリは必ずしも各プロセスで同じ仮想アドレスを持つとは限らないため、これらは機能しません。また、共有メモリがたまたま各プロセスで同じ仮想アドレスを持っていたとしても、ファイル マッピングの外を指している場合は機能しません。ポインターの代わりに、ファイル マッピングの先頭からのオフセットを格納する必要があります。

両方のプロセスが同じログイン セッションで実行されていますか? そうでない場合は、ファイル マッピングの名前にGlobal\プレフィックスを追加する必要があります。

また、INVALID_HANDLE_VALUEではなくを使用する必要があります(HANDLE)0xFFFFFFFFFINVALID_HANDLE_VALUE64 ビット Windows が追加されたときにの定義が変更されました。

LtEntity test(pBuf);の代わりに使用できますLtEntity test = LtEntity(pBuf);

于 2009-04-21T12:48:58.863 に答える
1

LtEntity にポインターがある場合、各プロセスのマップされたメモリ ブロックは通常、異なるアドレスで開始されるため、機能しません。代わりに相対アドレスを格納する Boost::interprocess offset pointersを使用してみてください。

于 2009-04-21T13:35:47.847 に答える
0

おそらく、シリアル化されていないポインター/参照もあるでしょうLtEntity

おそらくLtEntity、どのデータが欠落しているかについて、より多くの情報を提供できます。

于 2009-04-21T12:48:05.790 に答える