Partilhar via


Macros e funções para gerir DLLs

Observação

A biblioteca Microsoft Foundation Classes (MFC) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

Nome Description
AFX_EXT_CLASS] Aulas de exportação.
AFX_MANAGE_STATE Proteger uma função exportada numa DLL.
AfxOleInitModule Fornece suporte OLE a partir de uma DLL MFC regular que está dinamicamente ligada ao MFC.
AfxNetInitModule Fornece suporte para soquetes MFC a partir de uma DLL MFC normal que está dinamicamente ligada ao MFC.
AfxGetAmbientActCtx Obtém o estado atual do flag de estado por módulo.
AfxGetStaticModuleState Define o estado do módulo antes da inicialização e restaura o estado anterior após a limpeza.
AfxInitExtensionModule Inicializa a DLL.
AfxSetAmbientActCtx definir o flag de estado por módulo, que afeta o comportamento WinSxS do MFC.
AfxTermExtensionModule Permite ao MFC limpar a DLL da extensão MFC quando cada processo se desanexa da DLL.

AFX_EXT_CLASS

As DLLs de extensão MFC usam a macro AFX_EXT_CLASS para exportar classes; os executáveis que se ligam à extensão MFC DLL usam a macro para importar classes.

Observações

Com a AFX_EXT_CLASS macro, o(s) mesmo(s) ficheiro(s) cabeçalho(s) usados para construir a extensão MFC DLL podem ser usados com os executáveis que ligam à DLL.

No ficheiro de cabeçalho do seu DLL, adicione a AFX_EXT_CLASS palavra-chave à declaração da sua classe da seguinte forma:

class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};

Para mais informações, consulte Exportar e importar usando AFX_EXT_CLASS.

Requerimentos

Cabeçalho:<afxv_dll.h>

AFX_MANAGE_STATE

Chame esta macro para proteger uma função exportada numa DLL.

Sintaxe

AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )

Parâmetros

pModuleState
Um apontador para uma AFX_MODULE_STATE estrutura.

Observações

Quando este macro é invocado, pModuleState é o estado efetivo do módulo para o restante âmbito imediato de contenção. Ao sair do escopo, o estado efetivo anterior do módulo será automaticamente restaurado.

A AFX_MODULE_STATE estrutura contém dados globais para o módulo, ou seja, a parte do estado do módulo que é empurrada ou estourada.

Por padrão, o MFC usa o identificador de recurso do aplicativo principal para carregar o modelo de recurso. Se tiver uma função exportada numa DLL, como uma que inicia uma caixa de diálogo na DLL, o modelo de recurso é armazenado no módulo DLL. Certifique-se de mudar o estado do módulo para que a manivela correta seja usada. Pode trocar o estado adicionando o seguinte código ao início da função:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

Esta macro troca o estado atual do módulo com o estado devolvido desde AfxGetStaticModuleState o fim do âmbito atual.

Para mais informações sobre os estados dos módulos e MFC, veja Gestão dos dados de estado dos módulos MFC e Nota Técnica 58.

Observação

Quando o MFC cria um contexto de ativação para uma assembleia, é usado AfxWinInit para criar o contexto e AFX_MANAGE_STATE para o ativar e desativar. Note também que AFX_MANAGE_STATE está ativado para bibliotecas MFC estáticas, bem como DLLs MFC, para permitir que o código MFC seja executado no contexto de ativação adequado selecionado pela DLL do Utilizador. Para obter mais informações, consulte Suporte para contextos de ativação no estado do módulo MFC.

Requerimentos

Cabeçalho:<afxstat_.h>

AfxOleInitModule

Para suporte OLE a partir de uma DLL MFC normal que está dinamicamente ligada à MFC, chama esta função na função da CWinApp::InitInstance tua DLL MFC regular para inicializar a DLL OLE do MFC.

Sintaxe

void AFXAPI AfxOleInitModule( );

Observações

O MFC OLE DLL é uma DLL de extensão MFC; para que uma DLL de extensão MFC seja ligada a uma CDynLinkLibrary cadeia, deve criar um CDynLinkLibrary objeto no contexto de cada módulo que a irá utilizar. AfxOleInitModule cria o CDynLinkLibrary objeto no contexto da DLL MFC normal para que fique ligado à CDynLinkLibrary cadeia de objetos da DLL MFC regular.

Se estiveres a construir um controlo OLE e estiveres a usar COleControlModule, não deves chamar AfxOleInitModule porque a InitInstance função membro para COleControlModule chamadas AfxOleInitModule.

Requerimentos

Cabeçalho: <afxdll_.h>

AfxNetInitModule

Para suporte a sockets MFC a partir de uma DLL MFC normal que está ligada dinamicamente ao MFC, adicione uma chamada a esta função na função da CWinApp::InitInstance sua DLL MFC regular para inicializar a DLL dos sockets MFC.

Sintaxe

void AFXAPI AfxNetInitModule( );

Observações

A DLL MFC Sockets é uma DLL de extensão MFC; para que uma DLL de extensão MFC seja ligada a uma CDynLinkLibrary cadeia, deve criar um CDynLinkLibrary objeto no contexto de cada módulo que a irá utilizar. AfxNetInitModule cria o CDynLinkLibrary objeto no contexto da DLL MFC normal para que fique ligado à CDynLinkLibrary cadeia de objetos da DLL MFC regular.

Requerimentos

Cabeçalho:<afxdll_.h>

AfxGetAmbientActCtx

Use esta função para obter o estado atual do flag de estado por módulo, que afeta o comportamento WinSxS do MFC.

Sintaxe

BOOL AFXAPI AfxGetAmbientActCtx();

Valor de retorno

Valor atual do flag de estado do módulo.

Observações

Quando a flag é definida (que é o padrão) e uma thread entra num módulo MFC (ver AFX_MANAGE_STATE), o contexto do módulo é ativado.

Se a bandeira não estiver ativada, o contexto do módulo não é ativado na entrada.

O contexto de um módulo é determinado a partir do seu manifesto, frequentemente incorporado nos recursos do módulo.

Requerimentos

Cabeçalho:<afxcomctl32.h>

AfxGetStaticModuleState

Chame esta função para definir o estado do módulo antes da inicialização e para restaurar o estado anterior após a limpeza.

Sintaxe

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

Valor de retorno

Um apontador para uma AFX_MODULE_STATE estrutura.

Observações

A AFX_MODULE_STATE estrutura contém dados globais para o módulo, ou seja, a parte do estado do módulo que é empurrada ou estourada.

Por padrão, o MFC usa o identificador de recurso do aplicativo principal para carregar o modelo de recurso. Se tiver uma função exportada numa DLL, como uma que inicia uma caixa de diálogo na DLL, o modelo de recurso é armazenado no módulo DLL. Certifique-se de mudar o estado do módulo para que a manivela correta seja usada. Pode trocar o estado adicionando o seguinte código ao início da função:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

Esta macro troca o estado atual do módulo com o estado devolvido desde AfxGetStaticModuleState o fim do âmbito atual.

Para mais informações sobre os estados dos módulos e MFC, veja Gestão dos dados de estado dos módulos MFC e Nota Técnica 58.

Requerimentos

Cabeçalho:<afxstat_.h>

AfxInitExtensionModule

Chame esta função numa extensão MFC DLL DllMain para inicializar a DLL.

Sintaxe

BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state,  HMODULE hModule );

Parâmetros

state
Uma referência à AFX_EXTENSION_MODULE estrutura Structure que conterá o estado do módulo DLL de extensão MFC após a inicialização. O estado inclui uma cópia dos objetos da classe de runtime que foram inicializados pela extensão MFC DLL como parte da construção normal de objetos estáticos executada antes DllMain de ser introduzida.

hModule
Um handle do módulo DLL de extensão MFC.

Valor de retorno

TRUE se a DLL da extensão MFC for inicializada com sucesso; caso contrário, FALSE.

Observações

Por exemplo:

static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("NVC_MFC_DLL.DLL Initializing!\n");

        // MFC extension DLL one-time initialization
        if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
            return 0;
...

AfxInitExtensionModule faz uma cópia do HMODULE da DLL e captura as classes de runtime da DLL (CRuntimeClass estruturas) e também as suas fábricas de objetos (COleObjectFactory objetos) para uso posterior quando o CDynLinkLibrary objeto for criado. As DLLs de extensão MFC precisam de fazer duas coisas na sua DllMain função:

Pode ligar AfxTermExtensionModule para limpar a DLL da extensão MFC quando cada processo se desliga da DLL da extensão MFC (o que acontece quando o processo sai ou quando a DLL é descarregada por uma AfxFreeLibrary chamada).

Requerimentos

Cabeçalho:<afxdll_.h>

AfxSetAmbientActCtx

Use esta função para definir a flag de estado por módulo, que afeta o comportamento WinSxS da MFC.

Sintaxe

void AFXAPI AfxSetAmbientActCtx(BOOL bSet);

Parâmetros

bSet
Novo valor do flag de estado do módulo.

Observações

Quando a flag é definida (que é o padrão) e uma thread entra num módulo MFC (ver AFX_MANAGE_STATE), o contexto do módulo é ativado. Se a bandeira não estiver ativada, o contexto do módulo não é ativado na entrada. O contexto de um módulo é determinado a partir do seu manifesto, frequentemente incorporado nos recursos do módulo.

Example

BOOL CMFCListViewApp::InitInstance()
{
   AfxSetAmbientActCtx(FALSE);
   // Remainder of function definition omitted.
}

Requerimentos

Cabeçalho:<afxcomctl32.h>

AfxTermExtensionModule

Chame esta função para permitir que a MFC limpe a DLL de extensão MFC quando cada processo se desliga da DLL (o que acontece quando o processo termina, ou quando a DLL é descarregada por uma AfxFreeLibrary chamada).

Sintaxe

void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );

Parâmetros

state
Uma referência à AFX_EXTENSION_MODULE estrutura que contém o estado do módulo DLL de extensão MFC.

bAll
Se for VERDADEIRO, limpa todos os módulos DLL da extensão MFC. Caso contrário, limpa apenas o módulo DLL atual.

Observações

AfxTermExtensionModule irá eliminar qualquer armazenamento local ligado ao módulo e remover quaisquer entradas da cache do mapa de mensagens. Por exemplo:

static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("NVC_MFC_DLL.DLL Initializing!\n");

        // MFC extension DLL one-time initialization
        if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
            return 0;

        new CMyDynLinkLibrary(NVC_MFC_DLLDLL);

    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        TRACE0("NVC_MFC_DLL.DLL Terminating!\n");

        // Terminate the library before destructors are called
        AfxTermExtensionModule(NVC_MFC_DLLDLL);
    }
    return 1;   // ok
}

Se a sua aplicação carregar e libertar DLLs de extensão MFC dinamicamente, certifique-se de chamar AfxTermExtensionModule. Como a maioria das DLLs de extensão MFC não são carregadas dinamicamente (normalmente, elas são vinculadas por meio de suas bibliotecas de importação), a chamada para AfxTermExtensionModule geralmente não é necessária.

As DLLs de extensão MFC precisam de chamar AfxInitExtensionModule o seu DllMain. Se a DLL exporta CRuntimeClass objetos ou tem os seus próprios recursos personalizados, também precisa de criar um CDynLinkLibrary objeto em DllMain.

Requerimentos

Cabeçalho:<afxdll_.h>

Consulte também

Macros e globais
AfxMessageBox
Gerenciando os dados de estado dos módulos MFC