Partilhar via


DLLs de extensão

Uma extensão do MFC DLL é uma DLL que implementa normalmente reutilizáveis classes derivadas de classes de biblioteca Microsoft Foundation Class existentes.

Uma DLL de extensão do MFC tem os seguintes recursos e requisitos:

  • O cliente executável deve ser um aplicativo MFC, compilado com _AFXDLL definido.

  • Uma DLL de extensão também pode ser usado por uma DLL regular dinamicamente vinculada ao MFC.

  • DLLs de extensão devem ser compiladas com _AFXEXT definido.Isso força _AFXDLL também ser definido e garante que as declarações apropriadas é retirada do arquivos de cabeçalho MFC.Ele também garante que AFX_EXT_CLASS é definido como __declspec(dllexport) ao criar a DLL, que é necessário se você estiver usando essa macro para declarar as classes em sua extensão DLL.

  • DLLs de extensão não devem instanciar uma classe derivada de CWinApp, mas deve depender do aplicativo cliente (ou DLL) para fornecer esse objeto.

  • DLLs de extensão devem, no entanto, fornecer uma DllMain de função e fazer qualquer inicialização necessária lá.

DLLs de extensão são criadas usando a versão da biblioteca de vínculo dinâmico do MFC (também conhecido como a versão compartilhada do MFC).Somente MFC executáveis (aplicativos ou DLLs normais) são criados com a versão compartilhada do MFC podem usar uma extensão DLL.O aplicativo cliente e a DLL de extensão devem usar a mesma versão do MFCx0.dll.Com uma extensão DLL, você pode derivar novas classes personalizadas de MFC e então oferecer essa versão estendida do MFC para aplicativos que chamam sua DLL.

DLLs de extensão também podem ser usadas para passar objetos derivados MFC entre o aplicativo e a DLL.As funções de membro associadas com o objeto passado existem no módulo onde o objeto foi criado.Como essas funções são exportadas corretamente quando usando a versão DLL compartilhada do MFC, você pode passar livremente MFC ou ponteiros para objetos derivados MFC entre um aplicativo e a extensão DLLs ele carrega.

Uma DLL de extensão do MFC usa uma versão compartilhada do MFC da mesma forma que um aplicativo usa a versão DLL compartilhada do MFC, com algumas considerações adicionais:

  • Não tem um CWinApp-derivado objeto.Ele deve funcionar com o CWinApp-derivado de objeto do aplicativo cliente.Isso significa que o aplicativo cliente possui a bomba de mensagem principal, o loop ocioso e assim por diante.

  • Ele chama AfxInitExtensionModule no seu DllMain função.O valor de retorno dessa função deve ser verificado.Se um valor zero é retornado de AfxInitExtensionModule, retornam 0 do seu DllMain função.

  • Ele cria um CDynLinkLibrary objeto durante a inicialização se a extensão DLL desejar exportar CRuntimeClass objetos ou recursos para o aplicativo.

Antes da versão 4.0 do MFC, esse tipo de DLL foi chamado um AFXDLL.AFXDLL se refere a _AFXDLL símbolo do pré-processador que é definido ao criar a DLL.

As bibliotecas de importação para a versão compartilhada do MFC são nomeadas de acordo com a convenção descrita em as convenções de nomenclatura para DLLs do MFC.Visual C++ fornece versões pré-construídos DLLs MFC, além de um número de não - MFC DLLs, que você pode usar e distribuir com seus aplicativos.Estes são documentados em Redist. txt, que é instalado na pasta de programa Files\Microsoft Visual Studio.

Se você estiver exportando usando um arquivo. def, coloque o seguinte código no início e no final do seu arquivo de cabeçalho:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Estas quatro linhas garantem que seu código seja compilado corretamente para uma extensão DLL.Deixando estas quatro linhas pode causar sua DLL compilar ou vincular incorretamente.

Se você precisar passar um MFC ou ponteiro de objeto derivado de MFC ou para uma DLL do MFC a DLL deve ser uma DLL de extensão.As funções de membro associadas com o objeto passado existem no módulo onde o objeto foi criado.Como essas funções são exportadas corretamente quando usando a versão DLL compartilhada do MFC, você pode passar livremente MFC ou ponteiros para objetos derivados MFC entre um aplicativo e a extensão DLLs ele carrega.

Devido a C++ nome desconfiguração e exportação problemas, Exportar lista de extensão DLL pode ser diferente entre as versões de depuração e varejo da mesma DLL e DLLs para diferentes plataformas.Varejo MFCx0.dll tem cerca de 2.000 exportados pontos de entrada; debug MFCx0D.dll tem aproximadamente 3.000 pontos de entrada exportada.

Gerenciamento de memória

MFCx0.dll e todas as DLLs de extensão carregados na utilização de espaço de endereço de um aplicativo cliente o mesmo alocador de memória, carregamento de recursos e outros estados globais MFC como se estivessem no mesmo aplicativo.Isso é significativo porque as bibliotecas não - MFC DLL e DLLs regulares fazer exatamente o oposto e tem alocar cada DLL fora do seu próprio pool de memória.

Se uma extensão DLL aloca memória, que a memória pode combinar livremente com qualquer outro objeto alocado pelo aplicativo.Além disso, se um aplicativo que vincula dinamicamente a MFC falhar, a proteção do sistema operacional mantém a integridade de qualquer outro aplicativo do MFC a DLL de compartilhamento.

Da mesma forma outros estados MFC globais, como o atual arquivo executável para carregar recursos, também são compartilhados entre o aplicativo cliente e todas as DLLs de extensão do MFC, bem como MFCx0.dll si mesmo.

Compartilhamento de recursos e Classes

Exportação de recursos é feito através de uma lista de recursos.Cada aplicativo contém uma lista vinculada separada de CDynLinkLibrary objetos.Ao procurar um recurso, a maioria das implementações padrão MFC que carregar recursos analisar primeira o módulo atual do recurso (AfxGetResourceHandle) e se o recurso não for encontrado percorrer a lista de CDynLinkLibrary objetos tentando carregar o recurso solicitado.

Percorrer a lista tem desvantagens que é ligeiramente mais lenta e requer gerenciamento de intervalos de ID do recurso.Ele tem a vantagem que um aplicativo cliente com links para várias DLLs de extensão pode usar qualquer recurso fornecido DLL sem ter que especificar o identificador de instância DLL.AfxFindResourceHandleuma API é usada para percorrer a lista de recursos para procurar uma determinada correspondência.Ele leva o nome e um tipo de recurso e retorna o identificador de recurso onde foi encontrado primeiro (ou nulo).

Se você não quiser percorrer a lista e carregar somente os recursos de um local específico, use as funções AfxGetResourceHandle e AfxSetResourceHandle salvar alça antiga e definir a nova alça.Certifique-se de restaurar o identificador de recurso antigo antes de retornar para o aplicativo cliente.Para obter um exemplo do uso dessa abordagem explicitamente carregar um menu, consulte Testdll2. cpp no exemplo MFC DLLHUSK.

Criação dinâmica de objetos MFC recebe um nome MFC é semelhante.O mecanismo de desserialização do objeto MFC precisa ter todos os CRuntimeClass objetos registrados, de forma que pode reconstruir ao criar dinamicamente objetos C++ do tipo necessário com base no que foi armazenado anteriormente.

No caso do exemplo MFC DLLHUSK, a lista é semelhante:

head ->   DLLHUSK.EXE   - or -   DLLHUSK.EXE
               |                      |
          TESTDLL2.DLL           TESTDLL2.DLL
               |                      |
          TESTDLL1.DLL           TESTDLL1.DLL
               |                      |
           MFCOxxD.DLL                |
               |                      |
           MFCDxxD.DLL                |
               |                      |
            MFCxxD.DLL            MFCxx.DLL

onde xx é o número de versão; Por exemplo, 42 representa versão 4.2.

O MFCxx.dll é geralmente a última na lista de classe e recursos.MFCxx.dll inclui todos os recursos padrão do MFC, incluindo seqüências de caracteres de prompts para todas as IDs de comando padrão.Permite que colocá-lo no final da lista de DLLs e o próprio aplicativo cliente não tem sua própria cópia dos recursos padrão do MFC, mas contam com recursos compartilhados no MFCxx.dll em vez disso.

Mesclando os recursos e os nomes de classe de todas as DLLs no espaço de nome do aplicativo cliente tem a desvantagem de exigir que você tome cuidado com quais identificações ou nomes que você escolher.

O DLLHUSK exemplo gerencia o espaço de nome do recurso compartilhado usando vários arquivos de cabeçalho.

Se sua DLL de extensão do MFC precisa manter dados extras para cada aplicativo, você pode derivar uma nova classe de CDynLinkLibrary e criá-lo em DllMain.Quando executado, a DLL pode verificar a lista do aplicativo atual de CDynLinkLibrary objetos para encontrar uma que determinada extensão DLL.

h5f7ck28.collapse_all(pt-br,VS.110).gifO que você deseja fazer?

h5f7ck28.collapse_all(pt-br,VS.110).gifO que você deseja saber mais sobre?

Consulte também

Conceitos

DLLs no Visual C++