Compartilhar via


Inicializar DLLs de extensão

Porque extensão DLLs não tem um CWinApp-derivado de objeto (como DLLs normais), você deve adicionar código de inicialização e encerramento para o DllMain função gera o Assistente de DLL do MFC.

O assistente fornece o código a seguir para DLLs de extensão.No código, PROJNAME é um espaço reservado para o nome do seu projeto.

#include "stdafx.h"
#include <afxdllx.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE PROJNAMEDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
   if (dwReason == DLL_PROCESS_ATTACH)
   {
      TRACE0("PROJNAME.DLL Initializing!\n");
      
      // Extension DLL one-time initialization
      AfxInitExtensionModule(PROJNAMEDLL, 
                                 hInstance);

      // Insert this DLL into the resource chain
      new CDynLinkLibrary(Dll3DLL);
   }
   else if (dwReason == DLL_PROCESS_DETACH)
   {
      TRACE0("PROJNAME.DLL Terminating!\n");
   }
   return 1;   // ok
}

Criando um novo CDynLinkLibrary objeto durante a inicialização permite que a extensão DLL para exportar CRuntimeClass objetos ou recursos para o aplicativo cliente.

Se você usar a extensão DLL de um ou mais regulares DLLs, você deve exportar uma função de inicialização cria uma CDynLinkLibrary objeto.Essa função deve ser chamada de cada uma das DLLs normais que usam a extensão DLL.Um local apropriado para chamar essa função de inicialização está na InitInstance função de membro a dll regular CWinApp-derivado de objeto antes de usar qualquer uma das funções ou classes exportados da DLL de extensão.

No DllMain que o Assistente de DLL do MFC gera a chamada para AfxInitExtensionModule captura classes de tempo de execução do módulo (CRuntimeClass estruturas), bem como seus fábricas de objeto (COleObjectFactory objetos) para usar quando o CDynLinkLibrary objeto é criado.Você deve verificar o valor de retorno AfxInitExtensionModule; Se um valor zero é retornado de AfxInitExtensionModule, retornar zero de seu DllMain função.

Se sua extensão DLL será explicitamente vinculado a um arquivo executável (que significa que as chamadas executáveis AfxLoadLibrary para vincular a DLL), você deve adicionar uma chamada para AfxTermExtensionModule em DLL_PROCESS_DETACH.Esta função permite MFC limpar a extensão DLL quando cada processo desanexa da DLL de extensão (que acontece quando o processo é encerrado ou quando a DLL é descarregada como resultado de uma AfxFreeLibrary de chamada).Se sua extensão DLL será vinculado implicitamente o aplicativo, a chamada para AfxTermExtensionModule não é necessário.

Aplicativos que o link para as DLLs de extensão deve chamar explicitamente AfxTermExtensionModule ao liberar a DLL.Eles também devem usar AfxLoadLibrary e AfxFreeLibrary (em vez de funções Win32 LoadLibrary e FreeLibrary) se o aplicativo usa vários threads.Usando AfxLoadLibrary e AfxFreeLibrary garante que o código de inicialização e desligamento que executa quando a extensão DLL é carregado e descarregado não corromper o estado global do MFC.

Porque o MFCx0.dll é totalmente inicializado pelo tempo DllMain é chamado, você pode alocar memória e chamar funções MFC em DllMain (ao contrário da versão de 16 bits do MFC).

DLLs de extensão podem cuidar de multithreading por manipulação de DLL_THREAD_ATTACH e DLL_THREAD_DETACH casos na DllMain função.Nesses casos são passados para DllMain quando segmentos anexar e desanexar da DLL.Chamando TlsAlloc quando uma DLL é anexar permite que a DLL manter índices de armazenamento local (TLS) para cada thread anexado a DLL do thread.

Observe que o arquivo de cabeçalho Afxdllx.h contém definições especiais para estruturas usadas em DLLs de extensão, como a definição de AFX_EXTENSION_MODULE e CDynLinkLibrary.Você deve incluir o arquivo de cabeçalho na sua extensão DLL.

ObservaçãoObservação

É importante que você não define nem remover-nenhuma das macros em stdafx. h _AFX_NO_XXX.Para obter mais informações, consulte o artigo "PRB: problemas ocorrem ao definindo _AFX_NO_XXX" (Q140751).Você pode encontrar artigos do Knowledge Base em Biblioteca MSDN ou em http://search.support.microsoft.com/.

Uma função de inicialização de exemplo que alças multithreading está incluído no Usando Thread Local armazenamento em uma biblioteca de vínculo dinâmico na Windows SDK.Observe que o exemplo contém uma função de ponto de entrada chamada LibMain, mas essa função o nome DllMain para que ele funciona com as bibliotecas de tempo de execução MFC e C.

O exemplo MFC DLLHUSK demonstra o uso de funções de inicialização.

O que você deseja fazer?

O que você deseja saber mais sobre?

Consulte também

Conceitos

Inicializando uma DLL