Compartilhar via


Função CoFreeUnusedLibrariesEx (combaseapi.h)

Descarrega todas as DLLs que não estão mais em uso e cujo atraso de descarregamento expirou.

Sintaxe

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

Parâmetros

[in] dwUnloadDelay

O atraso em milissegundos entre o tempo em que a DLL afirmou que pode ser descarregada até se tornar um candidato a descarregar. Definir esse parâmetro como INFINITE usa o atraso padrão do sistema (10 minutos). Definir esse parâmetro como 0 força o descarregamento de quaisquer DLLs sem nenhum atraso.

[in] dwReserved

Esse parâmetro é reservado e deve ser 0.

Retornar valor

Nenhum

Comentários

O COM fornece funções para recuperar a memória mantida por DLLs que contêm componentes. A função mais usada é CoFreeUnusedLibraries. CoFreeUnusedLibraries não libera imediatamente DLLs que não têm nenhum objeto ativo. Há um atraso de 10 minutos para MTAs (apartamentos multithreaded) e NAs (apartamentos neutros). Para STAs (apartamentos de thread único), não há atraso.

O atraso de 10 minutos para CoFreeUnusedLibraries é evitar condições de corrida multithread causadas pelo descarregamento de uma DLL de componente. Esse atraso padrão pode ser muito longo para muitos aplicativos.

O COM mantém uma lista de DLLs ativas que tiveram componentes carregados para os apartamentos que podem ser hospedados no thread em que essa função é chamada. Quando CoFreeUnusedLibrariesEx é chamado, cada DLL nessa lista tem sua função DllCanUnloadNow chamada. Se DllCanUnloadNow retornar S_FALSE (ou não for exportado), essa DLL não estará pronta para ser descarregada. Se DllCanUnloadNow retornar S_OK, essa DLL será movida da lista ativa para uma lista "candidate-for-unloading".

Adicionar a DLL à lista candidate-for-unloading carimbos de data/hora da DLL dwUnloadDelay milissegundos de quando essa movimentação ocorre. Quando CoFreeUnusedLibrariesEx (ou CoFreeUnusedLibraries) é chamado novamente, pelo menos dwUnloadDelay milissegundos da chamada que moveu a DLL para a lista candidate-for-unloading, a DLL é realmente liberada da memória. Se COM usar a DLL do componente enquanto a DLL estiver na lista candidate-for-unloading, ela será movida de volta para a lista ativa.

Definir dwUnloadDelay como 0 pode ter consequências inesperadas. A DLL do componente pode precisar de algum tempo para limpeza após retornar da função DllCanUnloadNow . Por exemplo, se a DLL tivesse seus próprios threads de trabalho, o uso de um valor 0 provavelmente levaria a um problema porque o código em execução nesses threads seria não mapeado, causado pelo descarregamento da DLL antes que os threads de trabalho tivessem a chance de sair. Além disso, usar um valor muito breve para dwUnloadDelay pode levar a problemas de desempenho porque há mais sobrecarga no recarregamento de uma DLL do que deixá-la sair.

Esse comportamento é disparado pela DLL que fornece componentes com modelos de threading definidos como Livre, Neutro ou Ambos. Para um modelo de threading definido como Apartment (ou se nenhum modelo de threading for especificado), dwUnloadDelay será tratado como 0 porque esses componentes estão vinculados ao único thread que hospeda o apartamento.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows XP [aplicativos da área de trabalho | aplicativos UWP]
Servidor mínimo com suporte Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho combaseapi.h (inclua Objbase.h)
Biblioteca Ole32.lib
DLL ComBase.dll

Confira também

CoFreeAllLibraries

CoFreeLibrary

Cofreeunusedlibraries

Coloadlibrary

Dllcanunloadnow