Russian Qt Forum
Ноябрь 24, 2024, 21:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по динамической библиотеки  (Прочитано 2768 раз)
sibmail
Гость
« : Май 15, 2012, 04:55 »

Есть dll, которая делает какие-то примитивные вещи. Например:

lib.h
Код:
extern "C" 
{
    int F1();
    int F2();
}

lib.cpp
Код:
#include "lib.h"
int F1()
{
  return 1;
}

int F2()
{
  return 2;
}


Я захотел добавить в функцию F1 запуск потока (или класса). Подключил еще один .h .cpp
В функции F1 прописал T myT();
Код:
int F1()
{
  T myT();
  return 1;
}

Все нормально. Библиотека работает, запускается поток, делает свои вещи. Теперь возникла задача, чтобы по вызову функции F2() обращаться к потоку (классу) и что-то там изменять (управлять).
Как это оформить пока не понимаю...
И можно ли оформить экспортируемые функции в одном базовом классе? типа
Код:
class BaseLib :  public QObject
{
    Q_OBJECT
public:
    BaseLib();
extern "C"
{
    int F1();
    int F2();
}
}
Записан
alexis031182
Гость
« Ответ #1 : Май 15, 2012, 08:24 »

Создайте просто одну экспортируемую функцию-фабрику и базовый класс. Функция должна создавать и возвращать экземпляр базового класса. Она не может находиться внутри базового класса.

У данной функции возможны два варианта поведения:
- функция при каждом вызове создаёт новый экземпляр базового класса;
- функция при первом вызове создаёт экземпляр базового класса, а при последующих возвращает лишь указатель на ранее созданный объект.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #2 : Май 15, 2012, 08:40 »

И можно ли оформить экспортируемые функции в одном базовом классе? типа
Код:
class BaseLib :  public QObject
{
    Q_OBJECT
public:
    BaseLib();
extern "C"
{
    int F1();
    int F2();
}
}

Можно. Только нужно интерфейс класса обязательно прилагать к такой библиотеке.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
sibmail
Гость
« Ответ #3 : Май 15, 2012, 08:49 »

Создайте просто одну экспортируемую функцию-фабрику и базовый класс. Функция должна создавать и возвращать экземпляр базового класса. Она не может находиться внутри базового класса.
У данной функции возможны два варианта поведения:
- функция при каждом вызове создаёт новый экземпляр базового класса;
- функция при первом вызове создаёт экземпляр базового класса, а при последующих возвращает лишь указатель на ранее созданный объект.

не понял ваше предложение...
дело в том что приложение, использующее DLL уже написано, список функций известен и менять логику никто не будет. необходимо переписать уже существующую dll (сделать кроссплатформенную)
Записан
alexis031182
Гость
« Ответ #4 : Май 15, 2012, 09:14 »

Ну так сделайте:
Код:
class BaseLib :  public QObject
{
    Q_OBJECT
public:
    static BaseLib &instance() {static BaseLib object; return object;}

    BaseLib();
}

extern "C"
{
    int F1() {BaseLib &object = BaseLib::instance();}
    int F2() {BaseLib &object = BaseLib::instance();}
}
« Последнее редактирование: Май 15, 2012, 09:24 от alexis031182 » Записан
sibmail
Гость
« Ответ #5 : Май 15, 2012, 11:14 »

Ну так сделайте:
Код:
class BaseLib :  public QObject
{
    Q_OBJECT
public:
    static BaseLib &instance() {static BaseLib object; return object;}

    BaseLib();
}

extern "C"
{
    int F1() {BaseLib &object = BaseLib::instance();}
    int F2() {BaseLib &object = BaseLib::instance();}
}

спасибо, помогло! надеюсь дальше работа пойдет быстрее )))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.115 секунд. Запросов: 23.