Exportando e importando usando AFX_EXT_CLASS
uso deA DLL da extensão a macro AFX_EXT_CLASS exportar classes; os executáveis que vinculam ao uso da DLL de extensão a macro importar classes. Com a macro de AFX_EXT_CLASS , os mesmos arquivos de cabeçalho que são usados para criar a DLL de extensão podem ser usados com os executáveis que vinculam a DLL.
No arquivo de cabeçalho para o DLL, adicione a palavra-chave de AFX_EXT_CLASS à declaração da sua classe como segue:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
Esta macro é definido por MFC como __declspec(dllexport) quando os símbolos _AFXDLL e _AFXEXT de pré-processador são definidos. Mas a macro é definido como __declspec(dllimport) quando _AFXDLL é definido e _AFXEXT não será definido. Quando definido, o símbolo _AFXDLL de pré-processador indica que a versão compartilhada MFC está sendo usada pelo executável de destino (DLL) ou um aplicativo. Quando _AFXDLL e _AFXEXT são definidos, isso indica que o executável de destino é uma DLL da extensão.
Como AFX_EXT_CLASS é definido como __declspec(dllexport) ao exportar de uma DLL da extensão, você pode exportar classes inteiras sem colocar os nomes decorados para todos os símbolos de aquela classe no arquivo .def. Este método é usado por exemplo DLLHUSKMFC.
Embora você possa evitar criar um arquivo .def e todos os nomes decorados da classe com esse método, criar um arquivo .def é mais eficiente porque os nomes podem ser exportados por ordinal. Para usar o método do arquivo .def de exportar, coloque o código a seguir no início e o término 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
Aviso
Tenha cuidado ao exportar funções embutidas, porque podem criar a possibilidade de conflitos de versão.Uma função embutida obtém expandido no código do aplicativo; em virtude disso, se você uma recriação posterior a função, ele não será atualizado a menos que o próprio aplicativo é recompilado.Normalmente, as funções de DLL podem ser atualizadas sem recriar os aplicativos que os utilizam.
Exportando membros individuais em uma classe
Às vezes talvez você queira exportar membros individuais da classe. Por exemplo, se você estiver exportando CDialog- classe derivada, você pode apenas precisar exportar o construtor e a chamada de 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ê já não estiver exportando todos os membros de classe, você pode executar em um problema adicional devido à maneira como macros de MFC funcionam. Vários macros de auxiliar MFC realmente declaram ou define os membros de dados. Consequentemente, esses membros de dados também devem ser exportado do DLL.
Por exemplo, a macro de DECLARE_DYNAMIC é definido da seguinte maneira para criar uma DLL da extensão:
#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 AFX_DATA estático é declarando um objeto estática dentro da classe. Para exportar corretamente essa classe e acessar informações de tempo de execução de um executável do cliente, você deverá exportar esse objeto estático. Como o objeto estático é declarado com o modificador AFX_DATA, você só precisa definir AFX_DATA para ser __declspec(dllexport) ao criar seu DLL e define-o como __declspec(dllimport) durante a criação do executável do cliente. Como AFX_EXT_CLASS já está definido dessa forma, você precisa apenas de redefinir AFX_DATA para ser o mesmo que AFX_EXT_CLASS em torno da definição da 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 símbolo de AFX_DATA em itens de dados que define dentro de seus macros, trabalho dessa técnica para todos esses cenários. Por exemplo, funciona para DECLARE_MESSAGE_MAP.
Dica
Se você estiver exportando a classe inteira em vez de membros selecionados da classe, os membros de dados estáticos são exportados automaticamente.
O que você deseja fazer?
Exportar funções de C++ para uso em executáveis de linguagem C
Exportar funções de C para uso em executáveis de linguagem C ou C++