Compartilhar via


Exportar e importar usando AFX_EXT_CLASS

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

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

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

Essa macro é definida pelo MFC como __declspec(dllexport) quando os 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 definido.Quando definido, o símbolo do pré-processador _AFXDLL indica que a versão compartilhada do MFC está sendo usada por 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 nomes decorados para todos os símbolos da classe no arquivo. def.Este método é usado por exemplo MFC DLLHUSK.

Embora você pode 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 por ordinal.Para usar o método do arquivo. def de exportação, 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
Observação de cuidadoCuidado

Tenha cuidado ao exportar funções embutidas, pois eles podem criar a possibilidade de conflitos de versão.Uma função in-line 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 é recompilado.Normalmente, funções DLL podem ser atualizadas sem recriar os aplicativos que usá-los.

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-derivado classe, apenas talvez seja necessário exportar o construtor e o DoModal chamar.Você pode usar AFX_EXT_CLASS em membros individuais, você precisa exportar.

Por exemplo:

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 trabalho MFC macros.Várias macros do auxiliar do MFC realmente declarar ou definem os membros de dados.Portanto, esses membros de dados também devem ser exportados de sua DLL.

Por exemplo, o DECLARE_DYNAMIC macro é definida da seguinte maneira quando estiver criando uma DLL de 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 estático AFX_DATA é declarar 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 cliente executável, você deve exportar esse 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 defina-o como __declspec(dllimport) ao criar o executável do cliente.Porque AFX_EXT_CLASS já está definido dessa forma, você só precisa redefinir AFX_DATA o mesmo que AFX_EXT_CLASS em torno de 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

Porque MFC sempre usa o AFX_DATA símbolo em itens de dados define dentro de suas macros, essa técnica funciona para todas as situações.Por exemplo, ele funciona para DECLARE_MESSAGE_MAP.

ObservaçãoObservação

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

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

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

Consulte também

Conceitos

Exportando de uma DLL