Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятки с созданием dll под windows 
:(
    Опции темы
admsasha
Дата 11.12.2015, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть интерфейс i_plugin.h
Код

#ifndef I_PLUGIN_H
#define I_PLUGIN_H

#include <string>

class i_plugin {
    public:
        virtual std::string getPluginName() = 0;
        virtual std::string getVersion() = 0;
        virtual std::string getDescription() =0;
};

#endif // I_PLUGIN_H


Есть dll mydll.cpp
Код

#include <string>
#include "i_plugin.h"

#ifdef __WIN32__
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif

class  plugin_test : public i_plugin{
    public:
        plugin_test(){}
        ~plugin_test(){}

        std::string getPluginName(){
         return "test";
        }
        std::string getVersion(){
        return "1.0.0";
        }
        std::string getDescription(){
         return "test plugins";
        }
    
};

extern "C" EXPORT i_plugin* create() {
    return new plugin_test();
}


С основной программы гружу эту dll, вызываю create и успешно пользуюсь.

Потребовалось из dll вызывать методы основной программы. Под linux делаю вот так
Создаю еще один класс, типа

Код

#ifndef SHARE_H
#define SHARE_H

#include <string>

class share {
    public:
        void test1();
        std::string test2();
};

#endif


mydll.cpp переписываю так

Код

#include <string>
#include "i_plugin.h"
#include "share.h"

#ifdef __WIN32__
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif

class  plugin_test : public i_plugin{
    public:
        plugin_test(){}
        ~plugin_test(){}

        std::string getPluginName(){
            share a;
            a.test1();
         return "test";
        }
        std::string getVersion(){
        return "1.0.0";
        }
        std::string getDescription(){
         return "test plugins";
        }
    
};

extern "C" EXPORT i_plugin* create() {
    return new plugin_test();
}


Всё успешно собирается и работает. НО под mingw не собирается.
Код

$ g++ -shared mydll.cpp -o test.dll
C:\Users\admsasha\AppData\Local\Temp\cc4wBYCZ.o:mydll.cpp:(.text$_ZN11plugin_test13getPluginNameEv[__ZN11plugin_test13get
PluginNameEv]+0x10): undefined reference to `share::test1()'
collect2.exe: error: ld returned 1 exit status


Как правильно осуществить задуманное под windows ?

PM MAIL WWW ICQ Jabber   Вверх
math64
Дата 11.12.2015, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Я бы в плугин добавил ещё дестуктор.
Для вызова методов основной программы создал бы ещё один интерфейс, указатель на который передается конструктору плугина.
Код

//in common header
class i_share {
    public:
        virtual ~i_share() =0;
        virtual void test1() =0;
        virtual std::string test2() =0;
};

// in exe
class share : public i_share {...};

// in dll
extern "C" EXPORT i_plugin* create(i_share* s) {
    return new plugin_test(s);
}


Это сообщение отредактировал(а) math64 - 11.12.2015, 09:53
PM   Вверх
admsasha
Дата 11.12.2015, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



math64, Да, так работает, но это менее удобно.
PM MAIL WWW ICQ Jabber   Вверх
math64
Дата 11.12.2015, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Вариант 2.
Выделить класс Share во вторую dll. И загружать её обычным образом, через библиотеку импорта, как в exe, так и в первой dll.

Добавлено через 8 минут и 13 секунд
Ну а чтобы не ограничиваить себя и чтобы пругин мог пользоваться чем хочешь - можно в exe оставить только main().
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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