Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Создание MFC Dll extension


Автор: nikitos1980 8.4.2009, 10:30
Помогите решить проблему с реализацией ксасса в dll

файл .h
Код

#pragma once

// CSimpleObject command target

class AFX_EXT_CLASS CSimpleObject : public CObject
{

public:
    CSimpleObject();
    virtual ~CSimpleObject();
};


файл .cpp
Код

#include "stdafx.h"
#include "Ex01Dll.h"
#include "SimpleObject.h"


CSimpleObject::CSimpleObject()
{
}

CSimpleObject::~CSimpleObject()
{
}


При компиляции получаю ошибку 

Warning    1    warning C4273: 'CSimpleObject::CSimpleObject' : inconsistent dll linkage    d:\visual c++ .net\c++ .net\ex01dll\ex01dll\simpleobject.cpp    10    
Warning    2    warning C4273: 'CSimpleObject::~CSimpleObject' : inconsistent dll linkage    d:\visual c++ .net\c++ .net\ex01dll\ex01dll\simpleobject.cpp    14    
Error    3    error LNK2019: unresolved external symbol "__declspec(dllimport) const CSimpleObject::`vftable'" (__imp_??_7CSimpleObject@@6B@) referenced in function "public: __thiscall CSimpleObject::CSimpleObject(void)" (??0CSimpleObject@@QAE@XZ)    SimpleObject.obj    

Понимю, что компилятор не видит какой-то функции, но не могу реализовать решение.
С
Помогите любой инфой
Спасибо

Автор: Earnest 8.4.2009, 17:20
Непонятно, при компиляции чего у тебя вылезает ошибка: самой DLL или приложения, которое ее подключает?
Из поста можно понять, что вроде речь идет от компиляции DLL, но тогда ты действительно где-то напутал с макросами:
__declspec(dllimport) в этом контексте не должно встречаться, должен быть экспорт.

Смысл в следующем: класс из библиотеки экспортируется, а в приложении он же импортируется. Т.е. ключевые слова при компиляции должны быть разными, когда заголовок компилируется с библиотекой и с приложением. Это достигается с помощью макроса типа AFX_EXT_CLASS: он по разному реализуется в зависимости от наличия другого макроса, AFXEXT. Последний обычно прописываютс в свойствах библиотеки (т.е. он действует при компиляции библиотеки и приводит к тому, что AFX_EXT_CLASS читается как export). А вот при компиляции хедера из библиоткеи в составе приложения AFXEXT не определен, и AFX_EXT_CLASS читается как import.
Но есть одна загвоздка, о которой в MSDN написано смутно: это все работает, когда extension-библиотека ровно одна. А если их больше, и между ними есть зависимости, то одним макросом AFXEXT не обойдешься. Возможно, у тебя проблемы именно с этим: макрос не определен, должен быть импорт, а компилятор видит код, вот и ругается.
Обычно для "взрослого" приложения об AFXEXT лучше вообще забыть, а определить свои макро-метки для каждой extension DLL и, соответственно, свои определения :
Код

#ifdef _MYDLL
   #define MYDLL_API __declspec(dllexport)
#else
   #define MYDLL_API __declspec(dllimport)
#endif

Это пишешь в общем хедере библиотеки, который подключается к клиентскому коду. Сообтветствено, в свойствах библиотеки прописываешь макрос _MYDLL.
На тему разных AFX_EXT_CLASS, AFX_EXT_API и прочая можно не париться - это все одно и то же, хватит и одного макроса и для функций и для классов.
Надеюсь, смысл понятен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)