DLLs de extensão
Uma extensão do MFC DLL é uma DLL que implementa normalmente reutilizáveis classes derivadas de classes existentes de biblioteca Microsoft Foundation classe.
Uma DLL de extensão do MFC possui os seguintes recursos e requisitos:
O cliente executável deve ser um aplicativo MFC compilado com _AFXDLL definido.
Também é possível usar uma DLL de extensão de uma DLL de regular dinamicamente vinculado a MFC.
DLLs de extensão devem ser compiladas com _AFXEXT definido. Isso força _AFXDLL também seja definido e garante que as declarações apropriadas retirados do arquivos de cabeçalho MFC.Ele também garante que AFX_EXT_CLASS definido sistema autônomo __declspec(dllexport) ao criar a DLL, que é necessário se você estiver usando essa macro para declarar sistema autônomo classes em sua DLL de extensão.
DLLs de extensão não devem instanciar uma classe derivada de CWinApp, mas deve depender de aplicativo cliente (ou DLL) para fornecer esse objeto.
DLLs de extensão devem, no entanto, fornecer um DllMain função e executar 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 sistema autônomo a versão compartilhada do MFC).Somente executáveis MFC (aplicativos ou DLLs regulares) que são criados com a versão compartilhada do MFC podem usar uma DLL de extensão.O aplicativo cliente e a DLL de extensão devem usar a mesma versão do MFCx0.dll.Com uma extensão DLL, pode derivar de novas classes personalizadas de MFC e oferecem, em seguida, 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 de MFC entre o aplicativo e a DLL.As funções de membro associadas ao objeto passado existem no módulo onde o objeto foi criado.Como essas funções são exportadas corretamente ao usar a versão DLL compartilhada do MFC, você pode passar livremente MFC ou objeto derivado de MFC ponteiros entre um aplicativo e DLLs carrega a extensão.
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:
Ele não possui um CWinApp-derivados do objeto. Ele deve funcionar com o CWinApp-derivado de objeto do aplicativo cliente. Isso significa que o aplicativo cliente que detém a bomba de mensagem principal, o loop ocioso e assim por diante.
Ele chama AfxInitExtensionModule no seu DllMain função. O valor retornado desta função deve ser verificado.Se um valor igual a zero for retornado de AfxInitExtensionModule, retornam 0 do seu DllMain função.
Ele cria um CDynLinkLibrary objeto durante a inicialização se a DLL de extensão que deseja 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 pré-processador símbolo é 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 Convenções de nomeação de DLLs do MFC.O Visual C++ fornece versões pré-construídas MFC DLLs, além de um número de não-MFC DLLs que você pode usar e distribuir aos seus aplicativos.Eles estão documentados na Redist.txt, que é instalado na pasta programa Files\Microsoft Visual Studio.
Se você estiver exportando usando um arquivo .def, coloque o código a seguir no início e no participante 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 Certifique-se de que seu código é compilado corretamente para uma extensão DLL.Deixando esses quatro linhas pode fazer com que sua DLL compilar ou vincular incorretamente.
Se você precisar passar um MFC ou ponteiro de objeto derivado de MFC para ou de uma DLL do MFC, a DLL deve ser uma DLL de extensão.As funções de membro associadas ao objeto passado existem no módulo onde o objeto foi criado.Como essas funções são exportadas corretamente ao usar a versão DLL compartilhada do MFC, você pode passar livremente MFC ou objeto derivado de MFC ponteiros entre um aplicativo e DLLs carrega a extensão.
Devido a desconfiguração e exportar problemas de nome de C++, lista de exportar de uma extensão DLL pode ser diferente entre as versões de depurar e varejo da mesma DLL e DLLs para diferentes plataformas.O varejo MFCx0.dll tem cerca de 2.000 exportados pontos de entrada; a depurar MFCx0D.dll tem aproximadamente 3.000 pontos de entrada exportado.
Gerenciamento de memória
MFCx0.dll e todas sistema autônomo DLLs de extensão carregados para o uso do espaço de endereço de um aplicativo cliente o alocador de memória mesmo, carregamento de recurso e outros estados global MFC sistema autônomo se estivessem no mesmo aplicativo.Isso é significativo porque as bibliotecas DLL não-MFC e as DLLs regulares fazer o oposto exato e tem alocar cada DLL fora do seu próprio pool de memória.
Se uma DLL de extensão aloca memória, que a memória pode intermix livremente com outros objetos alocados por aplicativo.Além disso, se um aplicativo que esteja vinculada dinamicamente a MFC falhar, a proteção do sistema operacional mantém a integridade de qualquer Outros aplicativo do MFC a DLL de compartilhamento.
Da mesma forma outros estados MFC global, sistema autônomo o corrente executável carregar recursos, também são compartilhados entre o aplicativo cliente e todas sistema autônomo DLLs de extensão do MFC, bem sistema autônomo MFCx0.dll propriamente dito.
Compartilhamento de recursos e classes
Exportar recurso s é concluído por meio de um recurso lista.Cada aplicativo contém uma lista vinculada separada de CDynLinkLibrary objetos.Ao procurar um recurso, a maioria das implementações padrão de MFC que carregar recursos procurará primeiro lugar, no módulo de recursos corrente (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 é um pouco mais lenta e requer gerenciamento de intervalos de ID do recurso.Ele tem a vantagem que um aplicativo cliente com links para diversas DLLs de extensão pode usar qualquer recurso fornecido pelo DLL sem ter que especificar o identificador de instância DLL.AfxFindResourceHandle uma API é usada para percorrer a lista de recursos para procurar uma correspondência determinada. Ele usa o nome e o tipo de um recurso e retorna o identificador de recurso em que foi encontrado primeiro (ou nulo).
Não para orientá-lo da lista e carregar somente recursos de um local específico, use as funções AfxGetResourceHandle e AfxSetResourceHandle Para salvar a alça antiga e conjunto a nova alça. Certifique-se de restauração o identificador de recurso antigo antes de retornar ao aplicativo cliente.Para obter um exemplo do uso dessa abordagem para carregar explicitamente um menu, consulte .cpp Testdll2 no MFC amostra DLLHUSK.
Criação dinâmica de objetos do MFC recebe um nome MFC é semelhante.O mecanismo de desserialização do objeto MFC precisa ter todos a CRuntimeClass objetos registrados para que ele pode reconstruir ao criar dinamicamente objetos C++ do tipo necessário com base no que foi armazenado anteriormente.
No caso do MFC amostra 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
em que xx é o número de versão; por exemplo, 42 representa versão 4.2.
O MFCxx.dll é geralmente último na lista de classes e recursos.MFCxx.dll inclui todos os recursos MFC padrão, incluindo seqüências de caracteres de prompts para todos os IDs de comando padrão.Permite que colocá-lo no participante da lista de DLLs e o aplicativo cliente propriamente dito não ter sua própria cópia dos recursos padrão do MFC, mas dependem os recursos compartilhados no MFCxx.dll em vez disso.
Mesclando os recursos e nomes de classe de todas as DLLs no espaço para nome do aplicativo cliente tem a desvantagem de exigir que você tome cuidado com quais IDs ou nomes que você escolher.
The DLLHUSK amostra gerencia o espaço para nome de recurso compartilhado usando vários arquivos de cabeçalho.
Se precisar de sua DLL de extensão do MFC manter os dados extras para cada aplicativo, é possível derivar uma nova classe de CDynLinkLibrary e crie-o em DllMain. Quando em execução, a DLL pode consultar a lista do aplicativo corrente de CDynLinkLibrary objetos para localizar o item para esse determinado extensão DLL.