MAPI Advise() 呼び出しは0x8007000Eを返します (E_OUTOFMEMORY)

元の KB 番号: 269794

現象

アドバイズ関数を約 7,800 ~ 7,900 回呼び出すと、次のアドバイズ呼び出しがエラー 0x8007000E (E_OUTOFMEMORY) で失敗する可能性があります。

原因

通知は、アドバイズを呼び出すことによって登録され、共有メモリ領域を使用します。 既定では、ヒープ サイズは 0x100000 として設定されます。 新しい通知を登録するときにヒープ サイズを超えた場合は、E_OUTOFMEMORY エラーが返されます。

この制限はシステム全体です。つまり、Advise を呼び出す 2 つのプログラムを実行している場合、両方のプログラムの合計最大値は 7,900 未満である必要があります。

回避策

ヒープ サイズは、次のレジストリ キーを設定することで、0x800000と同じ大きさに構成できます。

HKLM\SOFTWARE\Microsoft\Windows メッセージング サブシステム
値名: SharedMemMaxSize
値の種類: REG_DWORD
値データ: 0x800000

HKLM\SOFTWARE\Microsoft\Windows メッセージング サブシステム\Applications\<MyApp>
値名: SharedMemMaxSize
値の種類: REG_DWORD
値データ: 0x800000

このシナリオでは、 <MyApp> はアプリケーションの名前 (.exe 拡張機能なし) です。 たとえば、アプリケーションが Mad.exe されている場合は、MyApp> 値に< MAD と入力します。