2009-04-21 6 views
-1

私のプロジェクトでは、CreateFileMappingのコンセプトを実装して、2つのプロセス間でメモリを共有しました。私はセッションデータのメモリアドレスを格納するサーバープロセスを持っています。これには特定のイメージに関する詳細が含まれています。そして私はバッファからそのアドレスを読み取るクライアントプロセスを持っています。今問題は、クライアントプロセスにアドレスが表示されていますが、詳細は表示されません。Windows CreateFilemappingを使用したエラー

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

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); 

変数「テスト」は、すべての詳細が含まれていますが、クライアント「テスト中"データが欠落しています。

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

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

あなたはおそらくあまりにも、シリアライズされていないLtEntity内のポインタ/参照を持っている..私は私のクライアントプロセスに見えるも、アイテムデータを必要とするの違いを確認し

答えて

0

を行ってください。

おそらくLtEntityについての詳細と、欠落しているデータがあります。

1

いくつかの詳細は、あなたは再びそれを言うことができ

が欠落しています。 LtEntityの定義は何ですか?

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

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

INVALID_HANDLE_VALUEであり、(HANDLE)0xFFFFFFFFFではありません。 64ビットWindowsが追加されたときにINVALID_HANDLE_VALUEの定義が変更されました。

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

1

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

+0

+1はBoost :: interprocessを推奨しています。素晴らしい(よくテストされた)抽象化を使用できる場合は、低レベルのエラーが発生する可能性のある細部に挑戦しないでください。 – lothar

関連する問題