Inicializando DLLs de extensão

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

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 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
}

Criar uma nova CDynLinkLibrary objeto durante a inicialização permite que a extensão DLL para exportar CRuntimeClass objetos ou recursos para o aplicativo do cliente.

Se você pretende usar sua extensão DLL a partir de um ou mais regulares DLLs, você deverá exportar uma função de inicialização que 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 a função de inicialização está na InitInstance a função de membro da DLL regular CWinApp-derivado de objeto antes de usar qualquer uma das classes exportados da DLL de extensão ou funções.

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

Se sua extensão DLL será explicitamente vinculado para um 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. Essa função permite que a MFC limpar a DLL de extensão, quando cada processo desanexa da DLL de extensão (que acontece quando o processo for encerrado ou a DLL é descarregada como resultado de uma AfxFreeLibrary de chamada). Se sua extensão DLL será vinculado implicitamente o aplicativo, a chamada para AfxTermExtensionModule é 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 das funções do 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 é executado quando a extensão DLL é carregado e descarregado não corromper o estado MFC global.

Porque o MFCx0.dll está 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 pelo tratamento de DLL_THREAD_ATTACH e DLL_THREAD_DETACH casos no DllMain função. Nesses casos são passados para DllMain quando threads anexar e desanexar da DLL. Chamando TlsAlloc quando anexação de uma DLL permite que a DLL manter os índices de armazenamento local (TLS) para cada segmento anexado à 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, por exemplo, 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 _AFX_NO_XXX em stdafx. h. Para obter mais informações, consulte o artigo da Base de Conhecimento "PRB: Problemas ocorrem ao definir _AFX_NO_XXX" (Q140751). Você pode encontrar artigos do Knowledge Base o Biblioteca MSDN ou em http://search.support.microsoft.com/.

Uma função de inicialização de amostra alças multithreading está incluído no Usando Thread armazenamento Local 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 você deve nomear esta função DllMain para que ele funciona com o MFC e c run-time 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 a respeito?

Consulte também

Conceitos

Inicializando uma DLL