Inicializando DLLs de extensão
Como as dlls de extensão não têm CWinApp- objeto derivado (como nas dlls normais), você deverá adicionar seus inicialização e código de término à função de DllMain que o assistente da DLL MFC gerencia.
O assistente fornece o seguinte código 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 um novo objeto de CDynLinkLibrary durante a inicialização permite que a DLL de extensão exporte objetos ou recursos de CRuntimeClass ao aplicativo cliente.
Se você pretende usar o DLL da extensão de um ou mais DLL regulares, você deverá exportar uma função de inicialização que cria um objeto de CDynLinkLibrary . Essa função deve ser chamada de cada um dos DLL normais que usam a DLL da extensão. O local apropriado para chamar essa função de inicialização está na função de membro de CWinAppnormal da DLL - objeto derivado de InitInstance antes de usar qualquer uma das classes exportadas ou das funções da DLL da extensão.
Em DllMain que o assistente da DLL MFC gerencia, a chamada para AfxInitExtensionModule captura as classes de tempo de execução de módulo (estruturas deCRuntimeClass ) bem como suas fábricas de objeto (objetos deCOleObjectFactory ) para uso quando o objeto de CDynLinkLibrary é criado. Você deve verificar o valor de retorno de AfxInitExtensionModule; se um valor nulo será retornado de AfxInitExtensionModule, retorna zero da função de DllMain .
Se seu DLL de extensão será vinculado explicitamente a um executável (significa que as chamadas executáveis AfxLoadLibrary vincular a DLL), você deve adicionar uma chamada a AfxTermExtensionModule em DLL_PROCESS_DETACH. Esta função permite que o MFC limpar a DLL de extensão quando cada processo desanexar da DLL de extensão (que acontece quando o processo é encerrado ou quando a DLL é descarregado no resultado de uma chamada de AfxFreeLibrary ). Se seu DLL de extensão será vinculado implicitamente no aplicativo, a chamada para AfxTermExtensionModule não é necessário.
Os aplicativos que vinculam explicitamente a DLL de extensão AfxTermExtensionModule devem chamar para liberar a DLL. Também devem usar AfxLoadLibrary e AfxFreeLibrary (em vez do Win32 funcionam LoadLibrary e FreeLibrary) se o aplicativo usar vários threads. Usar AfxLoadLibrary e AfxFreeLibrary garante que a inicialização e o desligamento codifiquem que executa a DLL de extensão é carregado e descarregado não compromete o estado global de MFC.
Como o MFCx0.dll é totalmente inicializado antes de DllMain é chamado, você pode alocar memória e chamar funções de MFC dentro de DllMain (em vez de versão de 16 bits de MFC).
Dlls de extensão podem levar de multithreading tratando DLL_THREAD_ATTACH e os casos de DLL_THREAD_DETACH em DllMain função. Esses casos são passados para DllMain quando os threads anexar e desanexar da DLL. A chamada TlsAlloc quando uma DLL está anexando permite que a DLL manter índices (TLS) de armazenamento de thread local para cada thread anexado à DLL.
Observe que o arquivo de cabeçalho Afxdllx.h contém definições especiais para as estruturas usadas na DLL da extensão, como a definição de AFX_EXTENSION_MODULE e CDynLinkLibrary. Você deve incluir esse arquivo de cabeçalho no DLL da extensão.
Dica
É importante que você ou define undefine ou alguns dos macros de _AFX_NO_XXX em Stdafx.h.Para obter mais informações, consulte o artigo da Base de Dados de Conhecimento “PRB: Os problemas ocorrem ao definir o _AFX_NO_XXX” (Q140751).Você pode localizar artigos da Base de Dados de Conhecimento na Biblioteca MSDN ou em http://search.support.microsoft.com/.
Uma função de exemplo de inicialização que trata a multithreading é incluída em Usando armazenamento de thread local em uma biblioteca de vínculo dinâmico) nativa em Windows SDK. Observe que o exemplo contém uma função de ponto de LibMainchamada, mas você deve nomear essa função DllMain de modo que trabalha com as bibliotecas de tempo de execução MFC e C de 2.0.
O exemplo DLLHUSK MFC demonstra o uso de funções de inicialização.
O que você deseja fazer?
Que você deseja saber mais?
O comportamento da biblioteca em tempo de execução do C e _DllMainCRTStartup
Usando o base de dados, o OLE, e as dlls de extensão de soquetes na DLL normais
Função de ponto de entrada da biblioteca de link dinâmico (Windows SDK)