Russian Qt Forum

Qt => Вопросы новичков => Тема начата: sibmail от Май 15, 2012, 04:55



Название: Вопрос по динамической библиотеки
Отправлено: 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();
}
}


Название: Re: Вопрос по динамической библиотеки
Отправлено: alexis031182 от Май 15, 2012, 08:24
Создайте просто одну экспортируемую функцию-фабрику и базовый класс. Функция должна создавать и возвращать экземпляр базового класса. Она не может находиться внутри базового класса.

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


Название: Re: Вопрос по динамической библиотеки
Отправлено: Kurles от Май 15, 2012, 08:40
И можно ли оформить экспортируемые функции в одном базовом классе? типа
Код:
class BaseLib :  public QObject
{
    Q_OBJECT
public:
    BaseLib();
extern "C"
{
    int F1();
    int F2();
}
}

Можно. (http://www.prog.org.ru/topic_8259_0.html) Только нужно интерфейс класса обязательно прилагать к такой библиотеке.


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

не понял ваше предложение...
дело в том что приложение, использующее DLL уже написано, список функций известен и менять логику никто не будет. необходимо переписать уже существующую dll (сделать кроссплатформенную)


Название: Re: Вопрос по динамической библиотеки
Отправлено: alexis031182 от Май 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();}
}


Название: Re: Вопрос по динамической библиотеки
Отправлено: sibmail от Май 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();}
}

спасибо, помогло! надеюсь дальше работа пойдет быстрее )))