Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание MFC Dll extension 
:(
    Опции темы
nikitos1980
Дата 8.4.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Помогите решить проблему с реализацией ксасса в 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    

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

PM MAIL WWW   Вверх
Earnest
Дата 8.4.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Непонятно, при компиляции чего у тебя вылезает ошибка: самой 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 и прочая можно не париться - это все одно и то же, хватит и одного макроса и для функций и для классов.
Надеюсь, смысл понятен.



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.