Compartilhar via


Ao inicializar DLLs de extensão

Porque sistema autônomo DLLs de extensão não possuem um CWinApp-derivado de objeto (sistema autônomo DLLs regulares), você deve adicionar o 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ê for usar a extensão DLL de um ou mais regulares DLLs, você deverá exportar uma função de inicialização que cria um CDynLinkLibrary objeto.Essa função deve ser chamada de cada uma das DLLs normais que usam a extensão DLL.Um local adequado para telefonar esta função de inicialização está no InitInstance função de membro da DLL regular CWinApp-derivado de objeto antes de usar qualquer uma das classes exportados ou funções a DLL de extensão.

No DllMain que o Assistente de DLL do MFC gera a telefonar para AfxInitExtensionModule captura () time de execução de classes do móduloCRuntimeClass estruturas), bem sistema autônomo seu objeto () fábricasCOleObjectFactory objetos) para utilizar quando o CDynLinkLibrary objeto é criado.Você deve verificar o valor retornado de AfxInitExtensionModule; Se um valor igual a zero for retornado de AfxInitExtensionModule, retornar zero de seu DllMain função.

Se sua DLL de extensão será explicitamente vinculado para um executável (o que significa que o executável chama AfxLoadLibrary Para vincular a DLL), você deve adicionar uma telefonar para AfxTermExtensionModule em DLL_PROCESS_DETACH.Essa função permite que a MFC limpar a DLL de extensão quando cada processo desanexa da DLL (o que acontece quando o processo for encerrado ou quando a DLL é descarregada sistema autônomo resultado de um de extensãoAfxFreeLibrary telefonar). Se sua DLL de extensão será vinculado implicitamente ao aplicativo, a telefonar para AfxTermExtensionModule não é necessário.

Aplicativos que vinculam explicitamente a DLLs de extensão devem telefonar AfxTermExtensionModule ao liberar a DLL.Eles também devem usar AfxLoadLibrary e AfxFreeLibrary (em vez das funções do Win32 LoadLibrary and FreeLibrary) Se o aplicativo usa vários threads.Usando AfxLoadLibrary e AfxFreeLibrary garante que o código de inicialização e desligado que é executado quando a extensão DLL é carregado e descarregado não corromper o estado global do MFC.

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

DLLs de extensão podem cuidar de multithreading, manipulando o DLL_THREAD_ATTACH and DLL_THREAD_DETACH casos no DllMain função. Nesses casos são passados para DllMain Quando os segmentos anexar e desanexar da DLL. De chamadaTlsAlloc quando anexação de uma DLL permite que a DLL manter índices (TLS) de armazenamento local de thread para cada segmento anexado à DLL.

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

Observação:

É importante que você não define nem remover qualquer uma das macros _AFX_NO_XXX no stdafx.h.Para obter mais informações, consulte o artigo da Base de dados de Conhecimento da Microsoft "PRB: Problemas ocorrem ao definindo _AFX_NO_XXX"(Q140751).Você pode encontrar artigos da Base de dados de Conhecimento na biblioteca MSDN ou no http://Pesquisar.suporte.Microsoft.com/.

Uma função de exemplo de inicialização que alças de multithreading é incluída no Usando armazenamento local de thread em uma biblioteca de vínculo dinâmico in the Windows SDK. Observe que o exemplo contém uma função de ponto de entrada chamada LibMain, mas o nome dessa função DllMain para que ele funciona com o MFC e C em time de execução bibliotecas.

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