Exportando e importando usando AFX_EXT_CLASS
DLLs de extensão usar a macro AFX_EXT_CLASS exportar classes; os executáveis link para a extensão DLL uso a macro para importar classes.Com o AFX_EXT_CLASS macro, os mesmos arquivos de cabeçalho são usadas para criar a DLL de extensão pode ser usada com arquivos executáveis que vinculam a DLL.
No arquivo de cabeçalho para sua DLL, adicione o AFX_EXT_CLsistema autônomoS palavra-chave para a declaração de sua clsistema autônomos sistema autônomo segue:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
Essa macro é definida pelo MFC sistema autônomo __declspec(dllexport) quando o pré-processador símbolos _AFXDLL and _AFXEXT são definidos. Mas a macro está definida sistema autônomo __declspec(DllImport) when _AFXDLL é definida e _AFXEXT não foi definido. Quando definida, o pré-processador símbolo _AFXDLL indica que a versão compartilhada do MFC está sendo usada pelo destino executável (uma DLL ou um aplicativo).Quando ambos os _AFXDLL and _AFXEXT são definidos, isso indica que o executável de destino é uma extensão DLL.
Porque AFX_EXT_CLASS definido sistema autônomo __declspec(dllexport) ao exportar de uma DLL de extensão, você pode exportar classes inteiras sem colocar sistema autônomo nomes decorados para todos sistema autônomo símbolos dessa classe no arquivo .def.Esse método é usado do MFC de amostra DLLHUSK.
Embora você possa evitar a criação de um arquivo .def e todos os nomes para a classe decorados com esse método, criando 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 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
Cuidado: |
---|
Tenha cuidado ao exportar embutido funciona, pois eles podem criar a possibilidade de conflitos de versão.Uma função in-line é expandida no código do aplicativo; portanto, se você posteriormente reescrever a função, ele não é atualizado, a menos que o aplicativo propriamente dito é 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 um CDialog-derivada da classe, você talvez só precise exportar o construtor e o DoModal Chame. Você pode usar AFX_EXT_CLASS sobre os 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
...
};
Porque não há mais exportar 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 da sua DLL.
Por exemplo, a DECLARE_DYNAMIC macro é definida sistema autônomo a seguir ao criar 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ática AFX_DATA é declarar um objeto estático dentro da sua classe. Para exportar essa classe corretamente e acessar informações em time de execução de um cliente executável, você deve exportar este objeto estático.Porque o objeto estático é declarado com o modificador de AFX_DATA, você precisará definir AFX_DATA a ser __declspec(dllexport) quando estiver criando sua DLL e defini-lo sistema autônomo __declspec(DllImport) durante a criação de seu executável de cliente.Porque AFX_EXT_CLASS já está definida dessa maneira, você apenas precisa redefinir AFX_DATA mesmo que AFX_EXT_CLASS ao redor 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
Como o MFC sempre usa o AFX_DATA símbolo em itens de dados, que ele define em suas macros, essa técnica funciona em todos os cenários de tais. Por exemplo, ele funciona para DECLARE_MESSAGE_MAP.
Observação: |
---|
Se você estiver exportando o classe inteira em vez de membros selecionados da classe, membros de dados estático são exportados automaticamente. |