2012-01-12 6 views
3

私は非常に新しいメモリマッピングファイルです。私は何かを少し失っています。メモリマップファイル - ファイルではなく構造をマップしますか?

ファイルがある場合、MMapsを使用してファイルを読み込んで、さまざまなプロセスから一度にアクセスすることができます。

私の状況では、プロセスAに接続されたDLLを作成していますが、そのDLLにプロセスAが準備したcSurfaceへのポインタが与えられています。そのCサーフェスのデータをプロセスBと共有する必要があります。空のMMapを呼び出してプロセスAのサーフェスをコピーする必要はなく、プロセスBで再度コピーする必要はありません。

私のサーフェスをファイルのようにマッピングすることができます。そのため、MMapは既に作成されているときにサーフェスデータを指しています(SomeTextFile.txtをロードしたときのように)。

私の計画では、Proc Aのサーフェスへのポインタを受け取り、そのサーフェスのメモリを指定の名前で共有するように指示し、Mutexesを使ってアクセスを調整します。煩雑なコピーをすることなく、同じ物理コピーを作成できます。

これは可能ですか?

+0

ちょっと私のポストを少し明確にすると思った。 'char buffer [SUPER_MASSIVE]'という膨大なバッファと 'hSuperMassiveFile'という膨大なファイルがあるとします。私は 'CreateFileMapping(hSuperMassiveFile、...)'を実行してSuperMassiveFileを共有することができましたが、私のバッファでも同じことをしたいと思います。 'CreateFileMapping((HANDLE)buffer、...)'を実行し、空のマップを要求せずに自分のバッファを共有し、それに 'CopyMemory()'を追加する方法がありますか? –

答えて

1

あなたのコメントをお寄せいただきありがとうございます。

さらに調査を行い、その答えが見つかりました。

メモリマッピングファイルを使用して、ファイルまたは空きメモリ容量のを共有できます。マップを設定する前にメモリ内で既に初期化されたデータを共有したい場合は、空白のマップを作成し、続いてそのマップにデータをコピーする必要があります。

2

はい、それはすべてCreateFileMappingのドキュメントにあります。

メモリマップファイルに名前を付けることができます。別のプロセスが同じ名前のmmapを開くと、同じメモリを指します。 CreateFileMappingのハンドルはINVALID_HANDLE_VALUEになり、純粋にメモリに保持されます。 CreateFileMapping

+0

それほど私が知っている、私の問題は、私のデータを含むMMapを開始させることです。私のデータが_file_にあって、 'CreateFileMapping(hMyFile、...); 'を実行した場合、マップは自動的にMyFileの内容を含みます。しかし、私のデータは記憶にあり、それは巨大です。 'CreateFileMapping(INVALID_HANDLE_VALUE、...);'を実行すると、初期化されていない荒れ地へのポインタが返され、大量のバッファをコピーして時間をかけなければなりません。地図が作成された瞬間から私のバッファを指し示すようにする方法があれば、それを好むだろう。 –

+0

私はDLLを作成しています。バッファは親アプリケーションによって作成されています。親は私に関数へのポインタとしてバッファへのポインタとそのサイズを渡します。だから私が見ることができる、私のオプションは、バッファをMMapped領域にコピーするか、何らかの方法でバッファが既に存在する領域をマップすることです。 –

関連する問題