次の方法で共有


CoFreeUnusedLibrariesEx 関数 (combaseapi.h)

使用されなくなった DLL とアンロード遅延の有効期限が切れている DLL をアンロードします。

構文

void CoFreeUnusedLibrariesEx(
  [in] DWORD dwUnloadDelay,
  [in] DWORD dwReserved
);

パラメーター

[in] dwUnloadDelay

DLL が指定するまでの遅延時間 (ミリ秒) は、アンロードの候補になるまでアンロードできます。 このパラメーターを INFINITE に設定すると、システムの既定の遅延 (10 分) が使用されます。 このパラメーターを 0 に設定すると、DLL のアンロードが遅延なく強制されます。

[in] dwReserved

このパラメーターは予約済みであり、0 である必要があります。

戻り値

なし

解説

COM には、コンポーネントを含む DLL によって保持されているメモリを再利用する関数が用意されています。 最もよく使用される関数は CoFreeUnusedLibraries ですCoFreeUnusedLibraries は、アクティブなオブジェクトを持たない DLL を直ちに解放しません。 マルチスレッド アパートメント (MTA) とニュートラル アパートメント (NAs) には 10 分の遅延があります。 シングル スレッド アパートメント (STA) の場合、遅延はありません。

CoFreeUnusedLibraries の 10 分の遅延は、コンポーネント DLL のアンロードによって発生するマルチスレッド 競合状態を回避することです。 この既定の遅延は、多くのアプリケーションでは長すぎる場合があります。

COM は、この関数が呼び出されるスレッドでホストできるアパートメントに対してコンポーネントが読み込まれたアクティブ DLL の一覧を保持します。 CoFreeUnusedLibrariesEx が呼び出されると、その一覧の各 DLL に DllCanUnloadNow 関数が呼び出されます。 DllCanUnloadNow がS_FALSEを返す (またはエクスポートされていない) 場合、この DLL はアンロードする準備ができていません。 DllCanUnloadNow がS_OKを返した場合、この DLL はアクティブなリストから "アンロード候補" リストに移動されます。

DLL をアンロード候補リストに追加すると、この移動が発生してから DLL dwUnloadDelay ミリ秒のタイムスタンプが設定されます。 CoFreeUnusedLibrariesEx (または CoFreeUnusedLibraries) が再度呼び出されると、DLL をアンロード候補リストに移動した呼び出しから少なくとも dwUnloadDelay ミリ秒が経過すると、DLL は実際にはメモリから解放されます。 DLL がアンロード候補リストにあるときに COM がコンポーネント DLL を使用する場合、その DLL はアクティブなリストに戻されます。

dwUnloadDelay を 0 に設定すると、予期しない結果になることがあります。 コンポーネント DLL が DllCanUnloadNow 関数から返された後、クリーンアップに時間が必要になる場合があります。 たとえば、DLL に独自のワーカー スレッドがある場合、値 0 を使用すると、これらのスレッドで実行されているコードがマップ解除され、ワーカー スレッドが終了する前に DLL のアンロードが原因で問題が発生する可能性が高くなります。 また、 dwUnloadDelay に短すぎる値を使用すると、DLL の再読み込み時にページアウトするよりもオーバーヘッドが大きくなるため、パフォーマンスの問題が発生する可能性があります。

この動作は、スレッド モデルが Free、Neutral、または Both に設定されたコンポーネントを提供する DLL によってトリガーされます。 スレッド モデルが Apartment に設定されている場合 (またはスレッド モデルが指定されていない場合)、 dwUnloadDelay はアパートメントをホストする単一スレッドに関連付けられているため、0 として扱われます。

要件

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

こちらもご覧ください

CoFreeAllLibraries

CoFreeLibrary

CoFreeUnusedLibraries

CoLoadLibrary

DllCanUnloadNow