Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
As DLLs de extensão MFC usam a macro AFX_EXT_CLASS para exportar classes; os executáveis que se ligam à DLL de extensão MFC usam a macro para importar classes. Com a macro AFX_EXT_CLASS , os mesmos arquivos de cabeçalho que são usados para criar a DLL de extensão MFC podem ser usados com os executáveis que se vinculam à DLL.
No arquivo de cabeçalho para sua DLL, adicione a palavra-chave AFX_EXT_CLASS à declaração de sua classe da seguinte maneira:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
Esta macro é definida pelo MFC como __declspec(dllexport) quando os símbolos _AFXDLL do pré-processador e _AFXEXT são definidos. Mas a macro é definida como __declspec(dllimport) quando _AFXDLL é definida e _AFXEXT não é definida. Quando definido, o símbolo _AFXDLL do pré-processador indica que a versão compartilhada do MFC está sendo usada pelo executável de destino (uma DLL ou um aplicativo). Quando ambos _AFXDLL e _AFXEXT são definidos, isso indica que o executável de destino é uma DLL de extensão MFC.
Como AFX_EXT_CLASS é definido como __declspec(dllexport) ao exportar de uma DLL de extensão MFC, você pode exportar classes inteiras sem colocar os nomes decorados para todos os símbolos dessa classe no arquivo .def.
Embora você possa evitar a criação de um arquivo .def e todos os nomes decorados para a classe com esse método, criar um arquivo .def é mais eficiente porque os nomes podem ser exportados pelo ordinal. Para usar o método de arquivo .def de exportação, coloque o seguinte código no início e no final do arquivo de cabeçalho:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA
Atenção
Tenha cuidado ao exportar funções embutidas, pois elas podem criar a possibilidade de conflitos de versão. Uma função embutida é expandida para o código do aplicativo; Portanto, se você reescrever a função posteriormente, ela não será atualizada, a menos que o próprio aplicativo seja recompilado. Normalmente, as funções DLL podem ser atualizadas sem reconstruir os aplicativos que as usam.
Exportando os membros individuais numa classe
Às vezes, você pode querer exportar membros individuais da sua classe. Por exemplo, se estiveres a exportar uma classe derivada CDialog, talvez só precises de exportar o construtor e a chamada DoModal. Você pode usar AFX_EXT_CLASS nos membros individuais que você precisa exportar.
Por exemplo:
class CExampleDialog : public CDialog
{
public:
AFX_EXT_CLASS CExampleDialog();
AFX_EXT_CLASS int DoModal();
...
// rest of class definition
...
};
Como você não está mais exportando todos os membros da classe, você pode encontrar um problema adicional devido à maneira como as macros MFC funcionam. Várias das macros auxiliares do MFC realmente declaram ou definem membros de dados. Portanto, esses elementos de dados devem ser exportados da sua DLL.
Por exemplo, a DECLARE_DYNAMIC macro é definida da seguinte forma ao criar uma DLL de extensão MFC:
#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
A linha que começa com static AFX_DATA está declarando um objeto estático dentro de sua classe. Para exportar essa classe corretamente e acessar as informações de tempo de execução de um executável cliente, você deve exportar esse objeto estático. Como o objeto estático é declarado com o modificador AFX_DATA, você só precisa definir AFX_DATA como ser __declspec(dllexport) ao criar sua DLL e defini-lo como __declspec(dllimport) ao criar o executável do cliente. Como AFX_EXT_CLASS já está definido dessa forma, você só precisa redefinir AFX_DATA para ser o mesmo que AFX_EXT_CLASS em torno da sua definição de classe.
Por exemplo:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_CLASS
class CExampleView : public CView
{
DECLARE_DYNAMIC()
// ... class definition ...
};
#undef AFX_DATA
#define AFX_DATA
Como o MFC sempre usa o AFX_DATA símbolo em itens de dados que define em suas macros, essa técnica funciona para todos esses cenários. Por exemplo, funciona para DECLARE_MESSAGE_MAP.
Observação
Se você estiver exportando a classe inteira em vez de membros selecionados da classe, os membros de dados estáticos serão exportados automaticamente.