CoLockObjectExternal 関数 (combaseapi.h)

オブジェクトをロックしてメモリ内に留まるか、そのようなロックを解除するために呼び出されます。

構文

HRESULT CoLockObjectExternal(
  [in] LPUNKNOWN pUnk,
  [in] BOOL      fLock,
  [in] BOOL      fLastUnlockReleases
);

パラメーター

[in] pUnk

ロックまたはロック解除するオブジェクトの IUnknown インターフェイスへのポインター。

[in] fLock

オブジェクトをロックするか解放するかを示します。 このパラメーターが TRUE の場合、オブジェクトは AddRef/Release 操作、登録、または失効とは関係なく、メモリ内に保持されます。 このパラメーターが FALSE の場合、この関数の呼び出しで以前に設定されたロックが解放されます。

[in] fLastUnlockReleases

ロックがオブジェクトを存続させる最後の参照である場合は、 TRUE を 指定してオブジェクトへのすべてのポインターを解放します (他の参照が存在する可能性があります)。 それ以外の場合は、 FALSE を指定します

fLockTRUE の場合、このパラメーターは無視されます。

戻り値

この関数は、E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、S_OKの標準戻り値を返すことができます。

注釈

CoLockObjectExternal 関数は、オブジェクトが実際に存在するプロセス (ハンドラーが読み込まれるプロセスではなく、EXE プロセス) で呼び出す必要があります。

CoLockObjectExternal 関数は、オブジェクトの参照カウントが 0 になるのを防ぎ、ロックが解除されるまでオブジェクトを "ロック" します。 同じ関数 (パラメーターが異なる) によってロックが解放されます。 ロックは、オブジェクトに対してシステム呼び出し IUnknown::AddRef を呼び出すことによって実装されます。 その後、fLock を FALSE に設定して CoLockObjectExternal を呼び出すまで、システムはオブジェクトで IUnknown::Release を呼び出すのを待機します。 この関数は、エンド ユーザーの代わりにオブジェクトの参照カウントを維持するために使用できます。これは、ユーザーと同様にオブジェクトの外部で動作するためです。

エンド ユーザーは、外部ロックがある場合でも、アプリケーションの有効期間を明示的に制御できます。 つまり、ユーザーがアプリケーションを閉じる場合は、シャットダウンする必要があります。 外部ロック ( CoLockObjectExternal によって設定されたロックなど) が存在する場合、アプリケーションは CoDisconnectObject 関数を呼び出して、シャットダウン前にこれらの接続を強制的に閉じることができます。

CoLockObjectExternal を呼び出すと、オブジェクトに対して強力なロックが設定されます。 強力なロックはオブジェクトをメモリ内に保持しますが、弱いロックは保持しません。 たとえば、OLE 埋め込みのサイレント更新中など、強力なロックが必要です。 埋め込みオブジェクトのコンテナーは、更新プロセスが完了するまでメモリ内に残る必要があります。 また、アプリケーション オブジェクトに対して強力なロックを設定して、クライアントへのサービスの提供が完了するまでアプリケーションが稼働し続けられるようにする必要があります。 すべての外部参照は、オブジェクトに厳密な参照ロックを設定します。

CoLockObjectExternal 関数は、通常、次の状況で呼び出されます。

  • オブジェクト サーバーは、表示されたら fLock と fLastLockReleases の両方を TRUE に設定して CoLockObjectExternal を呼び出す必要があります。 この呼び出しにより、ユーザーに代わって強力なロックが作成されます。 アプリケーションを閉じるときに、 CoLockObjectExternal の呼び出しでロックを解放し、 fLockFALSE に、 fLastLockReleases を TRUE に設定 します
  • サーバー上の CoLockObjectExternal の呼び出しは、 IOleContainer::LockContainer の実装でも使用できます。
LockContainer の実装で CoLockObjectExternal を使用する場合は、いくつかの点に注意する必要があります。 埋め込みオブジェクトは、そのコンテナーで LockContainer を呼び出して、実行を維持する (ロックする) 他の理由がない場合に実行を維持します。 埋め込みオブジェクトが表示された場合、コンテナーは OleSetContainedObject 関数を呼び出して埋め込みオブジェクトへの接続を弱める必要があります。そのため、他の接続がオブジェクトに影響を与える可能性があります。

アプリケーションがアプリケーションのすべての側面を管理し、 CoLockObjectExternal の呼び出しでドキュメントのシャットダウンを完全に管理しない限り、ロックカウントが 0 に達し、コンテナーが非表示になったときに終了するように、コンテナーは LockContainer でプライベート ロック数を保持する必要があります。 シャットダウンのすべての側面を維持し、プライベート ロック数を保持しないようにすることは、次のいずれかの条件が発生するたびに CoLockObjectExternal を呼び出す必要があることを意味します。

  • ドキュメントが作成され、破棄されるか、表示または非表示になります。
  • アプリケーションが起動し、ユーザーによってシャットダウンされます。
  • 擬似オブジェクトが作成され、破棄されます。
デバッグの目的で、アプリケーションに設定されている外部ロック (およびロック解除) の数を保持すると便利な場合があります。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー combaseapi.h (Objbase.h を含む)
Library Ole32.lib
[DLL] Ole32.dll

こちらもご覧ください

IOleContainer::LockContainer

OleSetContainedObject