次の方法で共有


コンパイラの警告 (レベル 1) C4683

'function': イベント ソースに 'out' パラメーターが存在します。複数のイベント ハンドラーをフックするときに注意が必要です。

解説

複数のイベント シンクが COM イベント ソースをリッスンしている場合に、out パラメーターの値が無視されることがあります。

次の状況では、メモリ リークが発生することに注意してください。

  1. 内部で割り当てられた out パラメーター (BSTR * など) がメソッドにある場合。

  2. イベントに複数のハンドラーがある (マルチキャスト イベントである) 場合。

リークの理由は、out パラメーターは複数のハンドラーによって設定されるが、最後のハンドラーによってしか呼び出しサイトに返されないことです。

次の例では C4683 が生成され、その修正方法が示されています。

// C4683.cpp
// compile with: /W1 /LD
#define _ATL_ATTRIBUTES 1
#include "atlbase.h"
#include "atlcom.h"

[ module(name="xx") ];

[ object ]
__interface I {
   HRESULT f([out] int* pi);
   // try the following line instead
   // HRESULT f(int* pi);
};

[ coclass, event_source(com) ]
struct E {
   __event __interface I;   // C4683
};