Partilhar via


Exportando e importando usando AFX_EXT_CLASS

DLLs de extensão usar a macro AFX_EXT_CLASS exportar classes; os executáveis que o link para a DLL de extensão usam a macro para importar classes. Com o AFX_EXT_CLASS macro, os mesmos arquivos de cabeçalho que são usados para construir a extensão DLL pode ser usado com arquivos executáveis que vinculam a DLL.

No arquivo de cabeçalho para a sua DLL, adicionar o AFX_EXT_CLASS palavra-chave para a declaração da classe da seguinte maneira:

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

Esta macro é definida pelo MFC como __declspec(dllexport) quando símbolos de pré-processamento _AFXDLL e _AFXEXT são definidos. Mas a macro é definida como __declspec(dllimport) quando _AFXDLL está definido e _AFXEXT não está definido. Quando definida, o símbolo do pré-processador _AFXDLL 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 extensão DLL.

Porque AFX_EXT_CLASS é definido como __declspec(dllexport) ao exportar de uma DLL de extensão, você pode exportar classes inteiras sem colocar os nomes decorados para todos os símbolos da classe no arquivo. def. Este método é usado, por exemplo o MFC DLLHUSK.

Embora você possa impedir a criação de um arquivo. def e todos os nomes para a classe decorados 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 fim 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

Aviso

Tenha cuidado ao exportar funções embutidas, pois eles podem criar a possibilidade de conflitos de versão. Uma função embutida obtém expandida no código do aplicativo; Portanto, se você posteriormente reescrever a função, ele não é atualizado, a menos que o próprio aplicativo for recompilado. Normalmente, as funções DLL podem ser atualizadas sem reconstruir os aplicativos que utilizem.

Exportação de membros individuais em uma classe

Às vezes, convém exportar membros individuais da sua classe. Por exemplo, se você estiver exportando uma CDialog-derivada da classe, talvez só precise exportar o construtor e o DoModal chamada. Você pode usar AFX_EXT_CLASS sobre os membros individuais, você precisa exportar.

For example:

class CExampleDialog : public CDialog
{
public:
   AFX_EXT_CLASS CExampleDialog();
   AFX_EXT_CLASS int DoModal();
   ...
   // rest of class definition
   ...
};

Porque você não estiver exportando todos os membros da classe, você pode ter um problema adicional por causa da maneira como esse trabalho de macros do MFC. Várias das macros do auxiliar do MFC realmente declarar ou definem os membros de dados. Portanto, esses membros de dados também devem ser exportados a partir de sua DLL.

Por exemplo, o DECLARE_DYNAMIC macro é definida da seguinte maneira quando estiver criando uma extensão DLL:

#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 estático AFX_DATA é declarar um objeto estático dentro da sua turma. Para exportar essa classe corretamente e acessar as informações de tempo de execução de um executável de cliente, você deve exportar este objeto estático. Porque o objeto estático é declarado com o modificador AFX_DATA, você precisará definir AFX_DATA ser __declspec(dllexport) ao criar sua DLL e defini-lo como __declspec(dllimport) ao criar o executável do cliente. Porque AFX_EXT_CLASS já está definida dessa forma, basta redefinir AFX_DATA para ser o mesmo que AFX_EXT_CLASS em torno de sua definição de classe.

For example:

#undef  AFX_DATA
#define AFX_DATA AFX_EXT_CLASS

class CExampleView : public CView
{
   DECLARE_DYNAMIC()
   // ... class definition ...
};

#undef  AFX_DATA
#define AFX_DATA

Porque o MFC sempre usa o AFX_DATA símbolo de itens de dados, ele define dentro de suas macros, isso funciona técnica para todos esses cenários. Por exemplo, ele funciona para DECLARE_MESSAGE_MAP.

ObservaçãoObservação

Se você estiver exportando de classe inteira em vez de membros selecionados da classe, membros de dados estáticos são automaticamente exportados.

O que você deseja fazer?

O que você deseja saber mais a respeito?

Consulte também

Conceitos

Exportação de uma DLL