2012-01-25 22 views
1

キャッシュライブラリをDLLに移動し、複数のアプリケーションがGlobalAlloc()を使用してDLL内に割り当てられた単一のポインタを共有できるようにします。これをどのように達成することができますか?また、パフォーマンスが大幅に低下するでしょうか?DLLから複数のWin32アプリケーションへのGlobalAlloc()メモリの共有

+2

DLLを使用しているすべての独立したプロセス間でメモリを直接共有しますか?ヒープAPIは、プロセスごとのメモリを割り当てるため、そのためのAPIではありません。プロセス間でメモリを共有するには、[ファイルマッピングAPIを使用した共有メモリ](http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v = vs.85))を使用する必要があります。 .aspx)(実際のファイルは必要ありません)。各プロセスで同じメモリを使用する一方で、メモリは異なるアドレスに終わる可能性があるので、異なるポインタ値を使用することに注意してください。 – BrendanMcK

答えて

2

確かにこれを行うことができ、単一のポインタにはパフォーマンス上の意味はありません。

従来のAPIであるGlobalAllocを使用するのではなく、別の共有ヒープを選択する必要があります。たとえば、COMアロケータであるCoTaskMemAllocを使用するのが最も簡単です。または、GetProcessHeapで取得したプロセスヒープをHeapAllocに渡すこともできます。例えば

、およびエラーチェックを示すために無視:あなたはメモリは、それが作成された場所から別のモジュールに割り当て解除されることを期待する場合にのみ、ヒープの共有を心配する必要は

void *mem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); 

注意を。あなたのDLLがメモリを作成して破壊するならば、普通の古いものを使うことができますmalloc。すべてのモジュールは同じプロセスアドレス空間に存在するため、そのプロセス内の任意のモジュールによって割り当てられたメモリは、他のモジュールで使用できます。

更新

私はあなたが同じメモリへのアクセスを持っている複数のプロセスを望むことができることを可能にピックアップする質問の最初の読み取りに失敗しました。それが必要なのであれば、メモリにマップされたファイルやIPCの何らかの形でのみ可能です。

関連する問題