PROBLEMA: DLLs não são descarregadas após chamar CoFreeUnusedLibraries

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 301357
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Bibliotecas de vínculo dinâmico (DLLs) que não estão em uso podem não ser descarregadas de espaço de processo após chamar a função CoFreeUnusedLibraries .
Causa
Esse problema ocorre quando o aplicativo ainda tem referências para os componentes na DLL ou quando o aplicativo libera todas as referências para uma DLL, mas não faz uma chamada subseqüente a CoFreeUnusedLibraries .
Resolução
CoFreeUnusedLibraries não libera imediatamente DLLs que não possuem nenhum objeto ativo. Há um atraso de dez minutos para apartments multithreaded (MTAs) e apartments neutros (NAs). Para single-threaded apartments (STAs), não há nenhum atraso. O atraso de dez minutos para CoFreeUnusedLibraries é evitar condições de corrida com vários threads causadas por descarregar uma DLL do componente.

Para contornar o problema, faça uma segunda chamada para CoFreeUnusedLibraries após dez minutos ou tornar periódicas chamadas para CoFreeUnusedLibraries . Para aplicativos que executado por longos períodos, como aplicativos de serviço do Windows NT, chamar CoFreeUnusedLibraries periodicamente garante que DLLs que não estão sendo usadas são descarregados.

Outra solução é chamar CoUninitialize , que fecha a biblioteca COM e libera todos os recursos utilizados pelo thread atual.
Situação
Esse comportamento é por design.
Mais Informações

Etapas para reproduzir o problema

O exemplo a seguir usa o Microsoft XML Parser versão 3 para demonstrar esse comportamento. Este analisador pode ser baixada e instalada do site do Microsoft Developer Network (MSDN):
  1. Crie um aplicativo de Console Win32 vazia no Microsoft Visual C++ 6.0.
  2. Salvar o código a seguir como main.cpp e adicioná-la para o projeto:
    #include <stdio.h>#include <conio.h>#import "msxml3.dll" named_guids raw_interfaces_onlyusing namespace MSXML2;// Global instance to force load/unload of OLE.struct InitOle {    InitOle()  { ::CoInitialize(NULL); }    ~InitOle() { ::CoUninitialize();   }} _init_InitOle_;			// Function declarations.inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};void main(){	try	{		printf( "Note that the msxml3.dll is not loaded yet. Press any key to start the test.\n\n" );		_getch();		// Create an instance of DOMDocument.  This will load Msxml3.dll into the process.		IXMLDOMDocument *pDoc = NULL;		HRESULT hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,			IID_IXMLDOMDocument, (LPVOID*)&pDoc);		TESTHR(hr);		// Release the reference.		if (pDoc) pDoc->Release();				// Free unused resources.		CoFreeUnusedLibraries();				printf( "Now the DLL is loaded into the process. Monitor the process and note that the DLL will not be released even after 10 minutes. Then press any key to continue..\n\n" );		_getch();		// Second call.		CoFreeUnusedLibraries();				printf( "Now the DLL should have been unloaded. Press any key to finish.\n\n" );		_getch();	}	catch(_com_error &e)	{		printf("Com Error:\n");		printf("Code = %08lx\n", e.Error());		printf("Code meaning = %s\n", (char*) e.ErrorMessage());		printf("Source = %s\n", (char*) e.Source());		printf("Error Description = %s\n", (char*) e.Description());	}}					
  3. Execute o aplicativo e usar um utilitário, como o Process Explorer da Sysinternals (consulte "Referências"), para monitorar o carregamento e descarregamento da Msxml3.dll.
Referências
O Process Explorer está disponível no seguinte site:
Os produtos de terceiros descritos neste artigo são fabricados por empresas que são independentes da Microsoft. A Microsoft não oferece garantia, implícita ou não, em relação ao desempenho ou à confiabilidade desses produtos.

A Microsoft fornece terceiros informações de contatos para ajudá-lo a encontrar suporte técnico. Essa informações de contatos podem ser alteradas sem aviso prévio. A Microsoft não garante a precisão dessas informações contatos de terceiros.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 301357 - Última Revisão: 12/06/2015 03:20:43 - Revisão: 4.5

Microsoft COM+ 2.0 Standard Edition

  • kbnosurvey kbarchive kbmt kbprb KB301357 KbMtpt
Comentários